我正在处理以下数据集
id name mode value
1 x buy 20
1 x sell 15
2 y sell 10
3 z buy 10
我想找到一个名称完成的净交易,因此上述情况的输出应该是
id name value
1 x 5
2 y -10
3 z 10
这怎么做。我尝试了group_by,然后申请,但它不起作用。 尝试根据模式拆分帧,因为y&z失败,让我知道如何完成此操作。
答案 0 :(得分:1)
我们可以先在map
之后使用mode更改值,然后再选择groupby
s=df.assign(value=df.value.mul(df['mode'].map({'buy':1,'sell':-1}))).\
groupby(['id','name'],as_index=False).sum()
id name value
0 1 x 5
1 2 y -10
2 3 z 10
答案 1 :(得分:1)
IIUC,我们可以将groupby.sum
与Series.where
一起使用
new_df = (df.assign(value = df['value'].where(df['mode'].eq('buy'), -df['value']))
.groupby(['id', 'name'],as_index=False)['value'].sum())
print(new_df)
id name value
0 1 x 5
1 2 y -10
2 3 z 10
或者:
new_df = (df.groupby(['id','name','mode'])['value'].sum()
.unstack('mode',fill_value=0)
.assign(value=lambda x: x.diff(axis=1).iloc[:,-1]))
print(new_df)
mode buy sell value
id name
1 x 20 15 -5.0
2 y 0 10 10.0
3 z 10 0 -10.0
如果您不想使用buy
和sell
列
new_df = new_df.drop(columns=['buy', 'sell'])
答案 2 :(得分:0)
您可以将卖出价格乘以-1,然后乘以groupby
:
df['value'] = np.where(df['mode']=='sell', df['value']*-1, df['value'])
df = df.groupby(by=['id', 'name'], as_index=False).sum()
print(df)
id name value
0 1 x 5
1 2 y -10
2 3 z 10