Python 熊猫-如何基于其他列减去行值?

Python 熊猫-如何基于其他列减去行值?,python,pandas,Python,Pandas,输入: 期望输出: 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 如何在熊猫中实现此输出?我试过grou

输入:

期望输出:

  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
如何在熊猫中实现此输出?我试过groupby,但这对值列有效。我想根据符号+类型减去行的值。比如(符号+买入->价值)减去(符号+卖出->价值)

让我们试试看

 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
如果需要,将销售转换为pos

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

我不知道这是否是最好的解决方案,但它肯定会起作用:


您可以使用Numpy将pandas矩阵转换为数组,通过该数组可以循环、搜索值等。对于Buy类型的列和Sell subtract类型的下一行中的havin示例(我希望我在这里得到了您的问题,很抱歉有任何误解),您可以简单地使用一个For循环来生成两个数组,一个是Sell类型,一个是Buy类型,然后从第一个数组中减去值1,从第二个数组中减去值1或类似的值。这肯定不如这个问题的另一个答案好,至少在这种情况下不是这样,但我确实相信,在某些情况下,这可能会更好,例如,因为numpy允许您重塑阵列

循环似乎不是最好的选择。在任何情况下,OP都很可能会找到一些更有用的代码来说明如何实现这一点。理解它花了一些时间。还在弄明白为什么要使用*=运算符。。。
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