web-dev-qa-db-ja.com

1つの列でpandas groupby操作を行うが、結果のデータフレームに他の列を保持する方法

私の質問は、パンダを使ったグループ操作についてです。私は次のDataFrameを持っています:

In [4]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est", "Est", "West", "West"]})

In [5]: df
Out[5]: 
   A   B     C
0  0  PO   Est
1  1  PO   Est
2  2  PA  West
3  3  PA  West

これが私がやりたいことです。列Bでグループ化し、列Aで合計を行いたいのですが、最後に、列CがまだDataFrameにあるようにしたいと思います。私が行った場合 :

In [8]: df.groupby(by="B").aggregate(pd.np.sum)
Out[8]: 
    A
B    
PA  5
PO  1

これは機能しますが、列Cが欠落しています。私もこれを行うことができます:

In [9]: df.groupby(by=["B", "C"]).aggregate(pd.np.sum)
Out[9]: 
         A
B  C      
PA West  5
PO Est   1

または

In [11]: df.groupby(by=["B", "C"], as_index=False).aggregate(pd.np.sum)
Out[11]: 
    B     C  A
0  PA  West  5
1  PO   Est  1

ただし、どちらの場合も、BだけでなくB AND Cでグループ化され、Cの値が保持されます。私がやりたいことは無関係ですか、それを行う方法はありますか?

16
Ger

dict of {column -> function}DataFrameGroupBy.agg() メソッドを使用してみます。

In [6]: df.groupby('B').agg({'A':'sum', 'C':'first'})
Out[6]:
       C  A
B
PA  West  5
PO   Est  1

ドキュメントから:

グループの集計に使用する関数。関数の場合、DataFrameを渡すとき、またはDataFrame.applyに渡すときに機能する必要があります。辞書を渡す場合、キーはDataFrame列名でなければなりません。

またはあなたの目標に応じてこのようなもの:

In [8]: df = pd.DataFrame({"A": range(4), "B": ["PO", "PO", "PA", "PA"], "C": ["Est1", "Est2", "West1", "West2"]})

In [9]: df.groupby('B').agg({'A':'sum', 'C':'first'})
Out[9]:
        C  A
B
PA  West1  5
PO   Est1  1

In [10]: df['sum_A'] = df.groupby('B')['A'].transform('sum')

In [11]: df
Out[11]:
   A   B      C  sum_A
0  0  PO   Est1      1
1  1  PO   Est2      1
2  2  PA  West1      5
3  3  PA  West2      5
25
MaxU