如何根据Pandas DataFrame中其他列的值仅对列的某些元素求和?

时间:2017-09-25 15:27:20

标签: python python-3.x pandas dictionary

假设我们有如下的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]})

我想总结列' a'的值。对于列' name'的每个不同值。

我试过这段代码:

for i in df['name'].unique(): df['tot']=df[(df.name==i)]['a'].sum()

在生成的新列中,' tot'列仅包含' name'的最后一个不同值的总和。即(只有' Fra')所有行,而不是[Ind,US,Fra等]各自的单独值。我希望在新列(tot)中有一个单元格,用于表示' name'的每个唯一值。专栏并最终希望对整个日期框架进行排序' df'通过每个唯一值的总和。

我尝试使用字典,

dc={}
for i in df['name'].unique():
   dc[i]=dc.get(i,0)+(df[(df.name==i)]['a'].sum())

我在字典中得到了理想的结果,所以我不知道如何根据字典的值来排序df,直到'

  

{' Ind':71,' Chn':84,' SG':10,' US':16,&# 39; Fra':165}

有没有人可以用尽可能多的方式解释锻炼这种情况的过程?处理大量数据时哪种方式最有效?谢谢!

编辑:我的预期输出只是将数据框df按新列的值排序' ..或者像在列中找到与最大值或最小值相关联的行。 TOT'

2 个答案:

答案 0 :(得分:2)

IIUIC,使用groupbytransform

In [3716]: df['total'] = df.groupby('name')['a'].transform('sum')

In [3717]: df
Out[3717]:
     a name  total
0    5  Ind     71
1    6  Chn     84
2    3   SG     10
3    4   US     16
4    7   SG     10
5   12   US     16
6   66  Ind     71
7   78  Chn     84
8   65  Fra    165
9  100  Fra    165

并使用sort_values

In [3719]: df.sort_values(by='total', ascending=False)
Out[3719]:
     a name  total
8   65  Fra    165
9  100  Fra    165
1    6  Chn     84
7   78  Chn     84
0    5  Ind     71
6   66  Ind     71
3    4   US     16
5   12   US     16
2    3   SG     10
4    7   SG     10

答案 1 :(得分:2)

您正在寻找[NSMutableDictionary dictionary]

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

编辑2:

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