2013-10-15 8 views
1

df1은 4 열의 DataFrame입니다.Python Pandas : Groupby 및 다중 열 적용

난 = 평균 (C) + 열 'C'와 'D'

열 'AA'에 다중 열 동작 열 'A'와 DF1 그룹핑하여 새로운 DataFrame (DF2)를 생성 할 이 작동하지 않습니다 (D)

열 'BB'= 표준 (D)

df1= pd.DataFrame({ 
    'A' : ['foo', 'bar', 'foo', 'bar','foo', 'bar', 'foo', 'foo'], 
    'B' : ['one', 'one', 'two', 'three','two', 'two', 'one', 'three'], 
    'C' : np.random.randn(8), 
    'D' : np.random.randn(8)}) 

    A  B   C   D 
0 foo one 1.652675 -1.983378 
1 bar one 0.926656 -0.598756 
2 foo two 0.131381 0.604803 
3 bar three -0.436376 -1.186363 
4 foo two 0.487161 -0.650876 
5 bar two 0.358007 0.249967 
6 foo one -1.150428 2.275528 
7 foo three 0.202677 -1.408699 

def fun1(gg): # this does not work 
    return pd.DataFrame({'AA':C.mean()+gg.C.std(), 'BB':gg.C.std()}) 


dg1 = df1.groupby('A') 
df2 = dg1.apply(fun1) 

의미한다. 집계()는 Series에서만 작동하며 다중 열 작업은 불가능합니다. apply()는 멀티 컬럼 작업으로 시리즈 출력 만 생성합니다. 다중 열 작업으로 다중 열 출력 (DataFrame)을 생성하는 다른 방법이 있습니까?

답변

2

f 기능에 오타가 있습니까? AA 두 번째 C.mean() + D.mean()를 들어 C.mean() + C.std() 또는 첫 번째 경우

C.mean() + D.mean() = C.mean() + C.std()AA,

In [91]: df = df1.groupby('A').agg({'C': lambda x: x.mean() + x.std(), 
            'D': lambda x x.std()}) 

In [92]: df 
Out[92]: 
      C   D 
A      
bar 1.255506 0.588981 
foo 1.775945 0.442724 

될 경우, 상황이 꽤 좋은하지 않습니다. groupby 객체에 대해 .agg 함수에 dict을 주면 두 개의 열에서 값을 가져 오는 방법이 없다고 생각합니다.

In [108]: g = df1.groupby('A') 

In [109]: df = pd.DataFrame({"AA": g.mean()['C'] + g.mean()['D'], "BB": g.std()['D']}) 

In [110]: df 
Out[110]: 
      AA  BB 
A      
bar 0.532263 0.721351 
foo 0.427608 0.494980 

임시 변수에 g.mean() 및 g.std()를 할당하여 두 번 계산하지 않도록 할 수 있습니다.

+0

나는 함수 f에서 오타를 수정했다. 감사 – notilas