2016-03-06 50 views
3

我有一個數據集,看起來像熊貓將貿易數據集轉換爲長格式的最有效方法?

tradeid buyer seller quantity 
1  John Mark  10 
2  Frank John  5 
3  John Jesse 4 

,其中基本上每一行對應一個買方和賣方之間的貿易。例如,在第一行中,我們看到約翰(買方)從馬克(賣方)那裏購買了10件貨物。

我想以每行對應的方式將數據集轉換爲交易者,以及此交易者買入或賣出的相應總數量。也就是說

output

trader totalbuy totalsell 
John 14  5 
Frank 5   0  
Jesse 0   4 
Mark 0   10 

我使用熊貓的最後一個版本,並且包含大量數據。上面的轉換最有效的方法是什麼?

非常感謝!

數據框:

import pandas as pd 
from io import StringIO 

datastring = StringIO("""\ 
tradeid buyer seller quantity 
1  John Mark  10 
2  Frank John  5 
3  John Jesse 4 
""") 

df = pd.read_table(datastring, sep='\s\s+', engine='python') 

回答

3

你可以做一對夫婦的groupby - sum其次水平concat

>>> >>> pd.concat(
    [df.quantity.groupby(df.buyer).sum()\ 
     .reset_index().set_index('buyer').rename(columns={'quantity': 'totalBuy'}), 
    df.quantity.groupby(df.seller).sum()\ 
      .reset_index().set_index('seller').rename(columns={'quantity': 'totalSell'})], 
    axis=1).fillna(0) 
    totalBuy totalSell 
Frank 5 0 
Jesse 0 4 
John 14 5 
Mark 0 10 
+0

非常簡單,功能強大。謝謝阿美! –

+1

@Noobie不客氣。這是一個非常強大的圖書館。 –

+0

btw爲什麼你在groupby之後重置和設置索引?不會groupby自動創建一個索引? –

3

您可以使用melt

(pd.melt(df, id_vars=['quantity'], value_vars=['buyer', 'seller'], 
     value_name='trader', var_name='tradetype') 
.groupby(['tradetype', 'trader']) 
.sum() 
.unstack(level=0) 
.fillna(0) 
.quantity 
.rename(columns={'buyer': 'totalbuy', 'seller': 'totalsell'}) 
) 

tradetype totalbuy totalsell 
trader       
Frank    5   0 
Jesse    0   4 
John    14   5 
Mark    0   10 
+0

謝謝!我從來沒有真正理解什麼是「融化」。也就是說,它在什麼程度上做了我不能用'pivot'或'groupby'做的事情 –

相關問題