如何在AAA
,BBB
,COL_1
,......,{{1}列中找到值COL_2
,COL_3
的序列} {其中COL_X
是一个数字,例如200,所以枚举不是一个好的解决方案)?
例如,如果有数据框X
,那么第1行和第4行应该是输出:
df
答案 0 :(得分:3)
您可以将行的相关列作为字符串加入,然后搜索AAA,BBB
模式。
In [152]: df.filter(regex='COL_').apply(lambda x: 'AAA,BBB' in ','.join(x), axis=1)
Out[152]:
0 True
1 False
2 False
3 True
dtype: bool
如果是数值,请使用map
In [166]: df.apply(lambda x: 'AAA,BBB' in ','.join(map(str, x)), axis=1)
Out[166]:
0 True
1 False
2 False
3 True
dtype: bool
In [175]: df[df.apply(lambda x: 'AAA,BBB' in ','.join(map(str, x)), axis=1)]
Out[175]:
ID COL_1 COL_2 COL_3 COL_4
0 1 AAA BBB CCC DDD
3 4 CCC AAA BBB DD
答案 1 :(得分:2)
您可以浏览所有移过一列并成对压缩的列:
def func(x):
return any(x1 == 'AAA' and x2 == 'BBB' for x1, x2 in
zip(x.slice_shift(1), x.slice_shift(-1)))
print(df[df.apply(func, axis=1)])
对于此数据框:
COL_1 COL_2 COL_3 COL_4 COL_5
ID
1 AAA BBB CCC DDD 10
2 DDD AAA CCC BBB 20
3 BBB AAA DDD CCC 30
4 CCC AAA BBB DDD 40
输出如下:
COL_1 COL_2 COL_3 COL_4 COL_5
ID
1 AAA BBB CCC DDD 10
4 CCC AAA BBB DDD 40
x.slice_shift(1)
相当于x[1:]
,但不会复制数据。