首页 > 解决方案 > 检查熊猫数据框的一列是否包含不同列的每一行的子字符串?

问题描述

很长一段时间以来,我一直坚持我最初认为是一项简单的任务。在这里,我将使用示例数据,因为实际的问题数据要混乱得多(而且保密)。基本上我有两列都包含字符串。我想检查列“子字符串”的每一行,如果它是“字符串”列的任何行的子字符串:

s1 = ['good', 'how', 'hello', 'start']
s2 = ['exit', 'hello you','where are you', 'goodbye']
test = pd.DataFrame({'substring':s1, 'string':s2})
>>> test

    string           substring
0   exit             good
1   hello you        how
2   where are you    hello
3   goodbye          start

本质上,如果列 A 是列 B 中任何位置的子字符串,我希望每一行都有一些指示符:

>>>test
    string           substring   C
0   exit             good        True
1   hello you        how         False
2   where are you    hello       True
3   goodbye          start       False

我似乎尝试了很多事情,但我只是迷路了。

我试过迭代行:

sub_test = pd.DataFrame(columns=test.columns)

    for index, row in test.iterrows():
        a = row['substring']
        delta = test[test['string'].str.contains(a)]
        if len(delta.index > 1):
            sub_test = pd.concat([sub_test, delta]) 

这让我得到了一些方法并返回:

>>>sub_test

    string      substring
3   goodbye     start
1   hello you   how

我认为有一种使用 lambda 的方法,但我没有成功:

test['C'] = test.apply(lambda row: row['substring'] in policies['substring'], axis = 1)

任何帮助,将不胜感激。谢谢

标签: pythonpandaslambdaiteration

解决方案


形成一个我们用来提取所有子字符串的大模式。然后我们使用isin检查来查看是否在substring任何地方匹配。

p = '('+'|'.join(test.substring)+')'
test['C'] = test['substring'].isin(test['string'].str.extractall(p)[0].unique())

  substring          string      C
0      good            exit   True
1       how  hello good you  False
2     hello   where are you   True
3     start         goodbye  False

这通过str.extractall返回带有匹配项的 DataFrame 来工作。

test['string'].str.extractall(p)

             0
  match       
1 0      hello
3 0       good

索引与 的索引有关test,这里不重要,还有一个级别表示匹配数(因为我们使用.extractall)。该值是匹配的子字符串。由于我们的捕获组包含特定的单词(不是一般模式),我们可以使用相等检查 ( isin) 来获取'substring'值的掩码。


推荐阅读