在Pandas DataFrame中,根据另一列汇总列的总和

12

我有一个类似于这样的pandas DataFrame:

>>> df = pd.DataFrame({'MONTREGL':[10,10,2222,35,200,56,5555],'SINID':['aaa','aaa','aaa','bbb','bbb','ccc','ccc'],'EXTRA':[400,400,400,500,500,333,333]})
>>> df
   MONTREGL SINID EXTRA
0        10   aaa   400
1        10   aaa   400
2      2222   aaa   400
3        35   bbb   500
4       200   bbb   500
5        56   ccc   333
6      5555   ccc   333

我想对每个 SINID 进行分组并汇总列 MONTREGL 的值...

这样我就可以得到 aaa 等组的总和为 2242... 同时我也想保留列 EXTRA 的值。

这是期望的结果:

   MONTREGL SINID EXTRA
0      2242   aaa   400
1       235   bbb   500
2      5611   ccc   333

非常感谢您的帮助!


2
你试过使用 groupby 吗? - yatu
1
打印(df.groupby(by=["SINID"])["MONTREGL"].sum()) - Rakesh
https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.groupby.html - alfunx
你能执行 print(df.info()) 并分享结果吗? - dimitris_ps
之前@yatu提出的解决方案在测试中有效,但在生产环境中无效。dfd= df.groupby('SINID').MONTREGL.sum().reset_index().assign(EXTRA=df.EXTRA.unique())我收到了错误信息Length of values does not match length of index - Soufiane Sabiri
4个回答

17

我最终使用了这个脚本:

dff = df.groupby(["SINID","EXTRA"]).MONTREGL.sum().reset_index()

它在测试和生产环境中都能正常工作。


5

我知道这篇文章已经有些年头了,但是对于其他人来说可能会有所帮助:

使用 loc: df.loc[df['SINID'] == aaa].MONTREGL.sum()

使用 groupby: df.groupby('SINID')['MONTREGL'].sum()

一个类似的问题在以下链接中得到了解答(请查看 Alex Riley 的回复):

如何使用 Pandas 对满足给定条件的列中的值求和?

祝你好运!


4
以下代码适用于你的示例:
df1 = df.groupby(["SINID"]).sum()
df1['EXTRA'] = df.groupby(["SINID"]).mean()['EXTRA']

结果:

       MONTREGL  EXTRA
SINID                 
aaa        2242  400.0
bbb         235  500.0
ccc        5611  333.0

-1
我的建议是使用与其他列相关的条件过滤数据框,然后应用sum函数,大致如下所示。
导入pandas库:import pandas as pd。

df=pd.Dataframe({a:[1,2,3],b:[2001,2015,2019],c:[1,0,1]})

aux=df[df.c>0]

sa=aux.a.sum()

sb=aux.b.sum()

我的语法可能不正确(我没有运行代码),但它很可能能够解决你的问题。

祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接