如何在一列上执行pandas groupby操作,但将另一列保留在结果数据帧中

Ger*_*Ger 14 python group-by dataframe pandas

我的问题是关于使用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
Run Code Online (Sandbox Code Playgroud)

这就是我想要做的事情:我想按B列进行分组并对A列进行总结.但最后,我希望C列仍然在DataFrame中.如果我做 :

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

它完成了工作,但缺少C列.我也可以这样做:

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

要么

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
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下,它都按B和C分组而不仅仅是B并且保持C值.我想做的事情是无关紧要还是有办法做到这一点?

Max*_*axU 22

尝试使用DataFrameGroupBy.agg()方法dict of {column -> function}:

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

来自docs:

用于聚合组的功能.如果是函数,则必须在传递DataFrame时或传递给DataFrame.apply时工作.如果传递了dict,则键必须是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
Run Code Online (Sandbox Code Playgroud)