私の質問は、パンダを使ったグループ操作についてです。私は次の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の値が保持されます。私がやりたいことは無関係ですか、それを行う方法はありますか?
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