1

df1 は 4 列の DataFrame です。

df1 を列 'A' でグループ化し、列 'C' および 'D' で複数列操作を行うことにより、新しい DataFrame (df2) を作成したい

列「AA」=平均(C)+平均(D)

列 'BB' = std(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)

これは動作しません。集計()はシリーズでのみ機能し、複数列の操作はできないようです。また、apply() は、複数列操作で Series 出力のみを生成します。複数列操作で複数列出力 (DataFrame) を生成する他の方法はありますか?

4

1 に答える 1

3

関数にタイプミスがありますfか?またはAA_ C.mean() + C.std()_C.mean() + D.mean()

この最初のケースAA=C.mean() + C.std()では、

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

2 番目のものについてはC.mean() + D.mean()、状況はあまり良くありません。groupby オブジェクトの.agg関数に dict を指定すると、2 つの列から値を取得する方法はないと思います。

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() を一時変数に割り当てて、それらを 2 回計算しないようにすることができます。

于 2013-10-15T18:15:02.697 に答える