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

时间:2020-09-14 18:49:23

标签: 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

所需的输出:

 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)

3 个答案:

答案 0 :(得分:1)

让我们尝试

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我不知道这是否是最好的解决方案,但它肯定可以工作:

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