2017-02-28 1 views
2

는 I 3 열이 팬더 GROUPBY 계열을 가지고 있고 다른 판다다른 데이터 프레임의 값을 기반으로 판다 그룹에 변경 사항을 적용하는 방법은 무엇입니까?

Data1        Data2(unique names) 

name col1 col2    name col 
a  10  -0.2    x  0.002 
b  80  0.3     a  0.004 
a  72  1.1     b  0.007 
a  54  0.8     ... 
b  90  -3.2 

가 팬더 dataframes

df1 = pd.DataFrame.from_dict(Data1) 
df2 = pd.DataFrame.from_dict(Data2) 

를 생성하고 상기 제를 GROUPBY dataframe의 값에 따른 세 번째 열에서 변경하고자 dataframe

df1Groupby = df1.groupby(df1.keys()[0]) 

는 DF1

같이 일반적인 이름으로 DF2의 행을 얻을
common = {} 
for i in df2[df2.keys()[0]]: 
    if i in df1[df1.keys()[0]].unique(): 
     common[i] = df2[df2.keys()[0]==i][df2.keys()[1]].values 
dfcommon = pd.DataFrame.from_dict(common) 

는 지금은 함수 정의

col2 = col2 + col1 * col

각 이름에 대한 데이터 1에 COL2을 변경하려면

def my_func(group, amt): 
    group[group.keys()[2]] = group[group.keys()[2]] + group[group.keys()[1]] * amt 
    return group 

다음 주에 전화 기능

for i in dfcommon.index: 
    df1Groupby.get_group(i).apply(my_func, dfcommon.loc[i].values[0],axis=1) 

하지만 다음 오류가 발생합니다.

TypeError: apply() got multiple values for argument 'axis'

내 접근 방식이 올바른지, 어떤 도움을 주셔서 감사합니다.

답변

2

pandas.Series.map을 사용하면 간단합니다. 'name'과 'col'사이에 매핑을 만들 것입니다. 두 번째 데이터 프레임에서 하나의 값을 검색하는 데 관심이있는 경우이 경우 두 데이터 프레임을 '병합'(조인) 할 필요가 없습니다.

# create a mapper 
mapper = Data2.set_index('name')['col'] 
mapped_value = Data1['name'].map(mapper) 

# crete new column 
data1['new_column'] = data1['col1'] + data1['col2'] * mapped_value 

희망 하시겠습니까? 그렇지 않은 경우 자세한 내용과 원하는 출력을 제공하십시오!

+0

와우! 나는 series.map에 대해 몰랐다. 그것은 단지 3 줄의 코드로 작동했습니다! 정말 대답을 주셔서 감사합니다 – Hamed

+1

원한다면 하나의 라이너로 만들 수 있습니다! :) 또한 두 가지 데이터 프레임을 병합하는 것보다 훨씬 빠르고 번거 로움이 없으며 이런 종류의 작업에 적극 권장됩니다! –

관련 문제