2014-11-11 1 views
1

를 통해 새 열을 만들 때 임시 변수를 피하기 위해 어떻게 명백한groupby.apply

df.groupby('keycol').apply(somefunc) 

의 결과로 dataframe df에 새 열 newcol를 만들 싶습니다 작동하지 않습니다 : df['newcol'] 모두 nan (RHS가 평가하는 대상이 아님)이거나 예외가 발생했습니다 (예외 세부 정보는에 따라 크게 다릅니다). 0 반환).

나는 그들은 모두 실패

import pandas as pd 
df['newcol'] = pd.Series(df.groupby('keycol').apply(somefunc), index=df.index) 

같은 물건을 포함하여 위의 많은 변화를 시도했다.

import pandas as pd 

tmp = df.groupby('keycol').apply(lambda x: pd.Series(somefunc(x))) 
tmp.index = df.index 
df['rank'] = tmp 

중간 변수를 만들지 않고도이를 달성 할 수있는 방법이 있나요 : 일했다

있는 유일한 방법은 중간 변수를 정의 할 필요?

은 ( GroupBy.apply에 대한 문서는 거의 컨텐츠 무료입니다.)

+1

데이터가 실제로 어떻게 생겼습니까? 또한 groupby를 만들고 함께 적용 하시겠습니까 (예 : 'agg'가 아닌)? "모두 실패합니다"라고 말하면,이 작업을 수행하여 정확히 무엇을하려고하는지에 대한 설명과 같이 특정 오류 메시지가 도움이됩니다. – Ajean

답변

0

은 이제 예를 구축하자 내가 첫 번째 시도가 실패하는 이유를 설명 할 수 있다고 생각 :

예 데이터 :

n = 25 
df = pd.DataFrame({'expenditure' : np.random.choice(['foo','bar'], n), 
        'groupid' : np.random.choice(['one','two'], n), 
        'coef' : randn(n)}) 
print df.head(10) 

결과 : 그래서

 coef expenditure groupid 
0 0.874076   bar  one 
1 -0.972586   foo  two 
2 -0.003457   bar  one 
3 -0.893106   bar  one 
4 -0.387922   bar  two 
5 -0.109405   bar  two 
6 1.275657   foo  two 
7 -0.318801   foo  two 
8 -1.134889   bar  two 
9 1.812964   foo  two 

SI를 적용하는 경우 우리는 다음을 얻을 그룹화 된 데이터에 mple 기능, mean :

df2= df.groupby('groupid').apply(mean) 
print df2 

입니다 :

   coef 
groupid   
one  -0.215539 
two  0.149459 

는 그래서 dataframe 위 groupid 색인 및 하나의 열 coef을 가지고 있습니다. newcol 모든 NaN을 제공

df['newcol'] = df2 

: 먼저해야 할 노력은 무엇

다음, 효율적이었다. 솔직히 나는 그것이 왜 오류를 던지지 않는지 전혀 모른다. 나는 왜 그것이 전혀 아무것도 생산하지 않을지 모르겠다. 나는 당신이 정말로 원하는 것은 DF를 병합하고 우리는, DF2에서 인덱스를 제거하고 새 열 이름을 변경해야 할 DF2하기 df

로 다시 df2 병합입니다 생각 다음 병합 :

df2= df.groupby('groupid').apply(mean) 
df2.reset_index(inplace=True) 
df2.columns = ['groupid','newcol'] 

df.merge(df2) 

하는 나는 라고 생각하면이 네가 있었던 곳이다.

df['newcol'] = df.groupby('groupid').transform(mean) 
print df.head() 

결과 :

 coef expenditure groupid newcol 
0 1.705825   foo  one -0.025112 
1 -0.608750   bar  one -0.025112 
2 -1.215015   bar  one -0.025112 
3 -0.831478   foo  two -0.073560 
4 2.174040   bar  one -0.025112 

더 나은 설명서를 here입니다

는 팬더가 훨씬 간단 구문에 모든이를 감싸는 transform 방법을 포함 같은 일반적인 관용구이다.