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

2024-04-29 15:45:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集

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

Tags: 数据frankimport交易者交易buyerjohnquantity
2条回答

您可以使用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

您可以执行几个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

相关问题 更多 >