假设我们有一个如下所示的 Pandas DataFrame:
df=pd.DataFrame({'name':['Ind','Chn','SG','US','SG','US','Ind','Chn', 'Fra','Fra'],'a':[5,6,3,4,7,12,66,78,65,100]})
我想对“name”列的每个不同值求“a”列的值之和。
我尝试了这段代码:
for i in df['name'].unique():
df['tot']=df[(df.name==i)]['a'].sum()
在生成的新列中,“tot”列仅包含所有行的“name”的最后一个不同值的总和,即(仅“Fra”),而不是每个 [Ind、US、Fra 等的单独值]。我希望在新列 (tot) 中为“名称”列的每个唯一值添加一个单元格,并最终希望通过每个唯一值的总和对整个日期框“df”进行排序。
我尝试使用字典,
dc={}
for i in df['name'].unique():
dc[i]=dc.get(i,0)+(df[(df.name==i)]['a'].sum())
我在字典中得到了想要的结果,所以我不知道如何根据字典“dc”的值从这里对 df 进行排序。
{'Ind': 71, 'Chn': 84, 'SG': 10, 'US': 16, 'Fra': 165}
有人可以解释一下以尽可能多的方式解决这种情况的过程吗?处理海量数据时哪种方法最有效?谢谢!
编辑:我的预期输出只是按新列“tot”的值对数据帧 df 进行排序。或者就像查找与“tot”列中的最大值或最小值关联的行。
最佳答案
您正在寻找groupby
df=pd.DataFrame({'name':['Ind','Chn','SG','US','SG','US','Ind','Chn','Fra','Fra'],'a':[5,6,3,4,7,12,66,78,65,100]})
df.groupby('name').a.sum()
Out[950]:
name
Chn 84
Fra 165
Ind 71
SG 10
US 16
Name: a, dtype: int64
编辑:
df.assign(total=df.name.map(df.groupby('name').a.sum())).sort_values(['name','total'])
Out[964]:
a name total
1 6 Chn 84
7 78 Chn 84
8 65 Fra 165
9 100 Fra 165
0 5 Ind 71
6 66 Ind 71
2 3 SG 10
4 7 SG 10
3 4 US 16
编辑2:
df.groupby('name').a.sum().sort_values(ascending=True)
Out[1111]:
name
SG 10
US 16
Ind 71
Chn 84
Fra 165
Name: a, dtype: int64
df.groupby('name').a.sum().sort_values(ascending=False)
Out[1112]:
name
Fra 165
Chn 84
Ind 71
US 16
SG 10
Name: a, dtype: int64
(df.groupby('name').a.sum().sort_values(ascending=False)).index.values
Out[1119]: array(['Fra', 'Chn', 'Ind', 'US', 'SG'], dtype=object)
关于python - 如何根据 Pandas DataFrame 中其他列的值仅对列的某些元素求和?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46408868/