熊猫groupby和subsubtract根据条件

时间:2020-07-08 16:08:30

标签: python pandas

我正在处理以下数据集

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失败,让我知道如何完成此操作。

3 个答案:

答案 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.sumSeries.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

如果您不想使用buysell

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