根据给定条件对Pandas中的行进行分组

2024-05-14 14:36:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框,看起来如图所示:

    date        close   Target  Loss
34  17-08-2021  1543.95 0       0
35  18-08-2021  1740.6  1       0
36  18-08-2021  1740.6  0       0
37  18-08-2021  1740.6  0       0
38  18-08-2021  1740.6  0       0
39  18-08-2021  1740.6  0       0
40  18-08-2021  1740.6  0       0
41  18-08-2021  1740.6  0       0
42  18-08-2021  1740.6  0       0
43  18-08-2021  1740.6  0       0
44  18-08-2021  1740.6  0       0
45  18-08-2021  1740.6  0       0
58  20-08-2021  873.6   0       1
59  20-08-2021  881.05  0       0
60  20-08-2021  864.05  0       1 
61  23-08-2021  928.35  1       0
62  23-08-2021  921.65  0       0
63  23-08-2021  813.8   0       1

现在我想使用groupby对数据帧中的所有值进行分组,其中Target或Loss列下的行为1。但我需要保留行顺序。我的意思是,在最终数据帧中,第35行应该是起始行,然后是第58、60、61、63行。最终数据帧应该如图所示:

    date        close   Satisfied
35  18-08-2021  1740.6  1
58  20-08-2021  873.6   1
60  20-08-2021  864.05  1
61  23-08-2021  928.35  1
63  23-08-2021  813.8   1

我关心订单的原因是因为我必须计算利润/损失,利润/损失可以通过减去结果数据帧中的接近值来获得,这些值可以通过diff方法实现


Tags: 数据方法订单targetclosedate顺序diff
2条回答

试试locpop

>>> df = df.loc[df[['Target', 'Loss']].eq(1).any(1)]
>>> df['Satisfied'] = df.pop('Target') + df.pop('Loss')
>>> df
          date    close  Satisfied
35  18-08-2021  1740.60          1
58  20-08-2021   873.60          1
60  20-08-2021   864.05          1
61  23-08-2021   928.35          1
63  23-08-2021   813.80          1
>>> 

首先求和列,然后按greate或等于1进行过滤应该是这里最简单的解决方案:

df['Satisfied'] = df.pop('Target') + df.pop('Loss')
df = df[df['Satisfied'].ge(1)]
print (df)
          date    close  Satisfied
35  18-08-2021  1740.60          1
58  20-08-2021   873.60          1
60  20-08-2021   864.05          1
61  23-08-2021   928.35          1
63  23-08-2021   813.80          1

如果需要Satisfied中的1和两列中可能的1,请执行以下操作:

print (df.head())
          date    close  Target  Loss
34  17-08-2021  1543.95       0     0
35  18-08-2021  1740.60       1     1 <- changed sample
36  18-08-2021  1740.60       0     0
37  18-08-2021  1740.60       0     0
38  18-08-2021  1740.60       0     0


df['Satisfied'] = (df.pop('Target') + df.pop('Loss')).clip(upper=1)

df = df[df['Satisfied'].eq(1)]
print (df)
          date    close  Satisfied
35  18-08-2021  1740.60          1
58  20-08-2021   873.60          1
60  20-08-2021   864.05          1
61  23-08-2021   928.35          1
63  23-08-2021   813.80          1

相关问题 更多 >

    热门问题