2017-09-25 150 views
1

假设我们有一个熊猫数据框类似如下:如何根据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”为列“名”的每个不同的值的值。

我试过这段代码:

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

在出现的新列,“TOT”列仅包含所有行的“名字”,即(仅适用于“法兰克福机场”)去年不同的价值的总和而不是[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从这里基于字典“DC”的值。

{ '工业':71, 'CHN':84, 'SG':10, 'US':16, '弗拉':165}

有谁请解释的过程中以尽可能多的方式锻炼这种情景?处理大量数据时,哪种方法最有效?谢谢!

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

+0

我只是学习如何通过其他columns..like找到与列“TOT”最大值或最小值相关联行的值数据帧DF排序。 – aspiringroboticist

回答

2

您正在寻找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) 
+1

如果需要新列'total',那么可以使用类似于以下内容的映射:'df ['total'] = df ['name']。map(df.groupby('name')。a.sum ))' – 0p3n5ourcE

+0

@零,你不需要...无论如何,谢谢〜:) – Wen

+0

@ 0p3n5ourcE是的,谢谢〜:) – Wen

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 
+0

老兄,我没有复制你的答案..当我回答时,你的问题是不存在的...... – Wen

+0

@零售兄弟,因为'总'元素的一些相同的索引在'名称'相同,我想知道如何从“名称”中获取唯一值。您能否告诉我如何在这里获得'名称'的独特价值?谢谢! – aspiringroboticist

相关问题