pandas 如何删除行以使列中的值与序列匹配

cunj1qz1  于 2023-01-15  发布在  其他
关注(0)|答案(1)|浏览(94)

我正在寻找一个更有效的方法来处理以下问题。我有一个数据框,其中一列填充了从1到4的随机值,我需要删除数据框中不遵循序列(1-2-3-4-1-2-3-...)的所有行。

A     B
12/2/2022    0.02   2
14/2/2022    0.01   1
15/2/2022    0.04   4
16/2/2022   -0.02   3
18/2/2022   -0.01   2
20/2/2022    0.04   1
21/2/2022    0.02   3
22/2/2022   -0.01   1
24/2/2022    0.04   4
26/2/2022   -0.02   2
27/2/2022    0.01   3
28/2/2022    0.04   1
01/3/2022   -0.02   3
03/3/2022   -0.01   2
05/3/2022    0.04   1
06/3/2022    0.02   3
08/3/2022   -0.01   1
10/3/2022    0.04   4
12/3/2022   -0.02   2
13/3/2022    0.01   3
15/3/2022    0.04   1
      ...

这就是我需要的

A     B
14/2/2022    0.01   1
18/2/2022   -0.01   2
21/2/2022    0.02   3
24/2/2022    0.04   4
28/2/2022    0.04   1
03/3/2022   -0.01   2
06/3/2022    0.02   3
10/3/2022    0.04   4
15/3/2022    0.04   1
        ...

由于 Dataframe 很大,我需要一些基于NumPy的操作来完成这个任务,越高效越好。我的解决方案非常丑陋和低效,基本上,我做了4个循环来检查序列的每一部分(4- 1,1 - 2,2 - 3,3 -4):

df_len = len(df)
df_len2 = 0
while df_len != df_len2:
    df_len = len(df)
    df.loc[(df.B.shift(1) == 4) & (df.B != 1), 'B'] = 0
    df = df[df['B'] != 0]
    df_len2 = len(df)
68bkxrlz

68bkxrlz1#

通过itertools.cycle(定义循环范围):
从itertools导入循环

c_rng = cycle(range(1, 5))  # cycled range
start = next(c_rng)  # starting point
df[[(v == start) and bool(start := next(c_rng)) for v in df.B]]
A  B
                 
14/2/2022  0.01  1
18/2/2022 -0.01  2
21/2/2022  0.02  3
24/2/2022  0.04  4
28/2/2022  0.04  1
03/3/2022 -0.01  2
06/3/2022  0.02  3
10/3/2022  0.04  4
15/3/2022  0.04  1

相关问题