如何为2个后续列提取具有给定值序列的行?

时间:2016-12-31 10:38:28

标签: python pandas

如何在AAABBBCOL_1,......,{{1}列中找到值COL_2COL_3的序列} {其中COL_X是一个数字,例如200,所以枚举不是一个好的解决方案)?

例如,如果有数据框X,那么第1行和第4行应该是输出:

df

2 个答案:

答案 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:],但不会复制数据。