2017-12-21 1 views
-1

Python/Pandas 사용 다른 행의 값에 두 개의 새로운 열 (AB)을 생성하여 데이터 프레임을 변환하려고합니다. 컬럼 ID3), 동일한 그룹 내에서 (ID1에 의해 결정됨). 각 그룹에 대해 ID1 Python Pandas : 데이터 프레임 그룹 내에서 다른 행의 값으로 새 열을 반복적으로 작성하십시오.

, 난 ID331 동일하다 ID2 값을 취하고 1 또는 2되는 ID3 조건부 A라는 새로운 항목이 값을 넣을. 마찬가지로 ID2 값을 ID341과 같고이 값을 B이라는 새 열에 넣고 다시 ID3의 조건부를 1 또는 2으로 설정합니다.

나는 다음과 같은 형식의 dataframe은 한 가정 :

import pandas as pd 

df = pd.DataFrame({'ID1': (1, 1, 1, 1, 2, 2, 2), 'ID2': (151, 152, 153, 154, 261, 262, 263), 'ID3': (1, 2, 31, 41, 1, 2, 41), 'ID4': (2, 2, 1, 2, 1, 1, 2)}) 
print(df) 

    ID1 ID2 ID3 ID4 
0 1 151 1 2 
1 1 152 2 2 
2 1 153 31 1 
3 1 154 41 2 
4 2 261 1 1 
5 2 262 2 1 
6 2 263 41 2 

후 변환 형식은 다음과 같습니다 무엇처럼 보일 것입니다. AB 열은 ID2의 값으로 채워지고 여기서 조건부 값은 ID3입니다.

ID1 ID2 ID3 ID4 A B 
0 1 151 1 2 153 154 
1 1 152 2 2 153 154 
2 1 153 31 1 
3 1 154 41 2 
4 2 261 1 1 
5 2 262 2 1   263 
6 2 263 41 2   263 

아래와 같은 내용을 사용하려고 시도했지만 변환시 원본 데이터 세트와 동일한 수의 값이 유지됩니다. 이것은 ID3 = 31 또는 41 인 행에는 문제가 있습니다. 또한 그룹 내에 31의 값이없는 경우 ID2 값을 기본적으로 반환합니다.

df['A'] = df.groupby('ID1')['ID2'].transform(lambda x: x.loc[df['ID3'] == 31]) 
df['B'] = df.groupby('ID1')['ID2'].transform(lambda x: x.loc[df['ID3'] == 41]) 

결과 :

ID1 ID2 ID3 ID4 A B 
0 1 151 1 2 153 154 
1 1 152 2 2 153 154 
2 1 153 31 1 153 154 
3 1 154 41 2 153 154 
4 2 261 1 1 261 263 
5 2 262 2 1 262 263 
6 2 263 41 2 263 263 

어떤 제안이? 미리 감사드립니다.

답변

0

아니요. 왜 이것이 최선의 해결책이라고 생각 하나, 해결책이라고 생각하지 않습니다.

.loc.where으로 바꿀 수 있습니다.이 조건은 조건이 참이 아닌 경우 NaN을 반환합니다. 그런 다음 NaN를 백필 후 다시 ID3이 잘 작동 1 또는 2

df['A'] = df.groupby('ID1')['ID2'].transform(lambda x: 
     x.where(df.ID3==31).fillna(method='bfill').where(df.ID3.isin([1,2]))) 

df['B'] = df.groupby('ID1')['ID2'].transform(lambda x: 
     x.where(df.ID3==41).fillna(method='bfill').where(df.ID3.isin([1,2]))) 

    ID1 ID2 ID3 ID4  A  B 
0 1 151 1 2 153.0 154.0 
1 1 152 2 2 153.0 154.0 
2 1 153 31 1 NaN NaN 
3 1 154 41 2 NaN NaN 
4 2 261 1 1 NaN 263.0 
5 2 262 2 1 NaN 263.0 
6 2 263 41 2 NaN NaN 
+0

인에 .where로 필터링! 도움이되는 의견에 감사드립니다. 코드에서는 내 데이터 프레임을'ID1'에서 정렬 한 다음 백필에서 모든 값을 NaN으로 바꾸지 않기 위해 ID3를 정렬해야합니다. 많은 감사합니다! – Beskimo

관련 문제