Pandas中最有效的方法是将交易数据集转换为长格式?

时间:2016-03-06 13:32:40

标签: python sql pandas

我有一个看起来像

的数据集
tradeid  buyer   seller   quantity
1        John    Mark     10
2        Frank   John     5
3        John    Jesse    4

其中每条线基本上对应于买方和卖方之间的交易。例如,在第一行中,我们看到John(买方)从Mark(卖方)购买了10件商品。

我想以每行对应的方式转换数据集,而不是交易者,并且我有相应的交易者买入或卖出的总数量。那是

output

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

我正在使用最新版本的pandas,而且数据很大。上面进行转换的最有效方法是什么?

非常感谢!!

数据帧:

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')

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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