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
和测试模式
- 将
0
s 替换为 NaN
s mask
- 使用
bfill
和 limit
来用前一个 填充第一个 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
我有一个数据框
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
和测试模式 - 将
0
s 替换为NaN
smask
- 使用
bfill
和limit
来用前一个 填充第一个 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