pandas 减去列中具有特定值值

rdrgkggo  于 2023-06-28  发布在  其他
关注(0)|答案(2)|浏览(101)

我有下表

| account | date       | client_ID | value |
|---------|------------|-----------|------|
| A       | 31/01/2023 | 1         | 10   |
| B       | 31/01/2023 | 1         | 2    |
| C       | 31/01/2023 | 1         | 50   |
| A       | 28/02/2023 | 1         | 15   |
| B       | 28/02/2023 | 1         | 11   |
| C       | 28/02/2023 | 1         | 50   |
| A       | 31/01/2023 | 2         | 7    |
| B       | 31/01/2023 | 2         | 10   |

对于每个date和client_id,我想用账户B的值减去账户A的值。因此,在2023年1月31日,client_id 1将为10-2=8,client_id 2将为7-10=-3。对于28/02/2023,只有client_id 1的数据,结果应为15-11=4。
因此,预期输出有3列:date、client_id和上面计算的差值。
对于某个日期或client_ID,可能没有A或B帐户,因此代码也应该能够处理这一点。
我该怎么做?
感谢您的评分

uz75evzq

uz75evzq1#

您可以merge帐户A和B来计算差值:

dfA = df[df['account'].eq('A')]  # extract account A
dfB = df[df['account'].eq('B')]  # extract account B

out = (dfA.merge(dfB, on=['date', 'client_ID'], how='outer')
          .fillna(0).drop(columns=['account_x', 'account_y'])
          .assign(result=lambda x: x.pop('value_x') - x.pop('value_y')))

输出:

>>> out
         date  client_ID  result
0  31/01/2023          1       8
1  28/02/2023          1       4
2  31/01/2023          2      -3
jfewjypa

jfewjypa2#

利用索引对齐:

tmp = df.set_index(['account', 'date', 'client_ID'])

out = (tmp.loc['A'].sub(tmp.loc['B'])
       .reset_index()
       )

# or
out = (tmp.loc['A'] - tmp.loc['B']).reset_index()
  • 这使您能够非常轻松地执行更复杂的操作(例如,(A-B)/C)。

输出:

date  client_ID  value
0  31/01/2023          1      8
1  28/02/2023          1      4
2  31/01/2023          2     -3

相关问题