pandas 按特定列中的值序列过滤数据框

pandas dataframe filter by sequence of values in a specific column

我有一个数据框

A B C

1 2 3

2 3 4

3 8 7

我只想获取 C 列中有 3,4 序列的行(在这种情况下 - 前两行)

最好的方法是什么?

您可以将 rolling 用于任何模式的通用解决方案:

pat = np.asarray([3,4])
N = len(pat)

mask= (df['C'].rolling(window=N , min_periods=N)
              .apply(lambda x: (x==pat).all(), raw=True)
              .mask(lambda x: x == 0) 
              .bfill(limit=N-1)
              .fillna(0)
              .astype(bool))

df = df[mask]
print (df)
   A  B  C
0  1  2  3
1  2  3  4

解释:

  • 使用rolling.apply和测试模式
  • 0s 替换为 NaNs mask
  • 使用 bfilllimit 来用前一个
  • 填充第一个 NAN 值
  • fillna NaN秒到 0
  • 最后由 astype
  • 转换为 bool

使用shift

In [1085]: s = df.eq(3).any(1) & df.shift(-1).eq(4).any(1)

In [1086]: df[s | s.shift()]
Out[1086]:
   A  B  C
0  1  2  3
1  2  3  4