如何为随后的两列提取具有给定值序列的行?

2024-03-28 20:50:10 发布

您现在位置:Python中文网/ 问答频道 /正文

如何在列COL_1COL_2COL_3COL_X中找到值AAABBB的序列(其中X是一些数字,例如200,因此枚举不是一个好的解决方案)?你知道吗

例如,如果有一个数据帧df,那么第1行和第4行应该是输出:

df=
ID    COL_1   COL_2   COL_3   COL_4
1     AAA     BBB     CCC     DDD
2     DDD     AAA     CCC     BBB
3     BBB     AAA     DDD     CCC
4     CCC     AAA     BBB     DDD

Tags: 数据iddf序列数字col解决方案bbb
2条回答

您可以浏览所有按1移位并成对压缩的列:

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:],但不复制数据。你知道吗

您可以将行的相关列作为字符串连接起来,然后搜索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

相关问题 更多 >