【问题标题】:Check if a column of a pandas dataframe contains a substring for each row of a different column?检查熊猫数据框的一列是否包含不同列的每一行的子字符串?
【发布时间】:2020-01-14 16:18:44
【问题描述】:

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

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)

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

【问题讨论】:

    标签: python pandas lambda iteration


    【解决方案1】:

    形成一个我们用来提取所有子字符串的大模式。然后我们使用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' 值的掩码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2020-09-19
      • 2021-01-16
      • 2023-03-03
      • 2021-02-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多