Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对一列执行groupby操作,但将另一列保留在结果数据帧中_Python_Pandas_Dataframe_Group By - Fatal编程技术网

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

Python 如何对一列执行groupby操作,但将另一列保留在结果数据帧中,python,pandas,dataframe,group-by,Python,Pandas,Dataframe,Group By,我的问题是关于熊猫的groupby操作。我有以下数据帧: 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列

我的问题是关于熊猫的groupby操作。我有以下数据帧:

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列仍然在数据帧中。如果我这样做:

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

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

试着用
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
从文档:

用于聚合组的函数。如果是函数,则必须 当传递给DataFrame或传递给DataFrame.apply时工作。如果 传递dict时,键必须是数据帧列名

或者类似的事情取决于你的目标:

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

如果要分组的所有值上的
C
值相同,则此操作有效。否则,
合并
就可以了。@Khris,谢谢你的提示!我添加了一个替代解决方案,它使用
.transform()
methodWonder!!非常感谢。我不熟悉,但这个问题可能会在python/pandas wiki或stackoverflow文档中结束?@MaxU:谢谢你提醒我使用
转换
函数,到目前为止,我忽略了这一点,而是用繁琐的合并解决了问题。
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