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

时间:2018-08-31 15:05:42

标签: python pandas dataframe

我想知道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 

2 个答案:

答案 0 :(得分:2)

您正在寻找的是:

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或2的组。更多。

答案 1 :(得分:1)

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

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