我有一个看起来像
的数据集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')
答案 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