2017-09-25 148 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

相關問題