繁体   English   中英

Pandas - 如何根据其他列减去行值?

[英]Pandas - How to subtract row values based on other columns?

输入:

  Symbol  Type  Value
0   AAPL   BUY    400
1   AAPL  SELL    310
2   INFY  SELL    190
3    JSL   BUY    120
4    JSW   BUY    190
5    JSW  SELL    170
6    REL   BUY    110
7    TCS   BUY    210
8    TCS  SELL    200

期望输出:

 Symbol  Type  Value
0   AAPL   BUY     90
2   INFY  SELL    190
3    JSL   BUY    120
4    JSW   BUY     20
6    REL   BUY    110
7    TCS   BUY     10

我如何在熊猫中实现这个输出? 我尝试过 groupby 但它适用于 Value 列。 我想根据值的符号+类型减去行。 像 (Symbol+BUY->Value) 减去 (Symbol+Sell->Value)

让我们试试

df.Value *= np.where(df.Type=='BUY', 1, -1)
out = df.groupby('Symbol', as_index=False).agg({'Type':'first','Value':'sum'})
out
Out[152]: 
  Symbol  Type  Value
0   AAPL   BUY     90
1   INFY  SELL   -190
2    JSL   BUY    120
3    JSW   BUY     20
4    REL   BUY    110
5    TCS   BUY     10

如果需要将sell 转换为pos

out.Value *= np.where(out.Type=='BUY', 1, -1)
out
Out[157]: 
  Symbol  Type  Value
0   AAPL   BUY     90
1   INFY  SELL    190
2    JSL   BUY    120
3    JSW   BUY     20
4    REL   BUY    110
5    TCS   BUY     10
df2 = df.pivot_table(index='Symbol', columns='Type', values='Value', aggfunc='sum').\
    fillna(0).eval('Value = BUY - SELL').drop(columns=['BUY', 'SELL']).reset_index()
    
df2.insert(1,'Type', np.where(df2['Value'] > 0, "BUY", "SELL"))
df2['Value'] = abs(df2['Value'])

Type Symbol  Type  Value
0      AAPL   BUY   90.0
1      INFY  SELL  190.0
2       JSL   BUY  120.0
3       JSW   BUY   20.0
4       REL   BUY  110.0
5       TCS   BUY   10.0

我不知道这是否是最好的解决方案,但它绝对应该有效:

您可以使用 Numpy 将您的 Pandas 矩阵转换为一个数组,通过该数组您可以遍历、搜索值等。对于您的示例来说,拥有 Buy 类型的列和 Sell 类型的下一行减去(我希望我我在这里解决了你的问题,抱歉有任何误解),你可以简单地使用一个 for 循环来创建两个数组,一个是 Sell 类型,一个是 Buy 类型,然后从第一个数组中减去 1 的值和值1 从第二个或类似的东西。 对于这个问题,它绝对不如其他答案好,至少在这种情况下不是,但我确实相信它在某些情况下可能会好得多,例如因为 numpy 可以让您重塑数组

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM