假设我们有如下的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'
答案 0 :(得分:2)
IIUIC,使用groupby
和transform
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