使用熊猫过滤具有特定条件的列的简单工具



我想知道python中是否存在一种工具来过滤遵循特定条件的列之间的数据。我需要生成一个干净的数据帧,其中"A"列中的所有数据在"E"列中必须具有相同的连续数字(并且此数字至少重复两次(。这里有一个例子:

df
Out[30]: 
A         B           C          D           E
6        1       2.366       8.621      10.835        1
7        1       2.489       8.586      10.890        2
8        1       2.279       8.460      10.945        2
9        1       2.296       8.559      11.000        2
10       2       2.275       8.620      11.055        2
11       2       2.539       8.528      11.110        2
50       2      3.346       5.979      10.175         5
51       3       3.359       5.910      10.230        1
52       3       3.416       5.936      10.285        1 

输出将是:

df
Out[31]: 
A         B           C          D           E
7        1       2.489       8.586      10.890        2
8        1       2.279       8.460      10.945        2
9        1       2.296       8.559      11.000        2
10       2       2.275       8.620      11.055        2
11       2       2.539       8.528      11.110        2
51       3       3.359       5.910      10.230        1
52       3       3.416       5.936      10.285        1 

您要查找的是:

import numpy as np
df.groupby((df.E != df.E.shift(1)).cumsum()).filter(lambda x: np.size(x.E) >= 2)
# or
df[df.groupby((df.E != df.E.shift(1)).cumsum()).E.transform('size') >= 2]

输出:

A      B      C       D  E
7   1  2.489  8.586  10.890  2
8   1  2.279  8.460  10.945  2
9   1  2.296  8.559  11.000  2
10  2  2.275  8.620  11.055  2
11  2  2.539  8.528  11.110  2
51  3  3.359  5.910  10.230  1
52  3  3.416  5.936  10.285  1

解释:

您希望保留E中存在大小大于 2 的连续组的所有记录。

第一部分(df.E != df.E.shift(1)).cumsum()允许您在第E列中标记连续的组,然后按该标签分组并过滤DataFrame,仅保留大小为 2 或更大的组。

您应该能够执行以下操作:

mask = (df['E'] == df['E'].shift(1)) | (df['E'] == df['E'].shift(-1))
filtered_df = df[mask]

最新更新