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