【问题标题】:Pandas - check if a string column contains a pair of stringsPandas - 检查字符串列是否包含一对字符串
【发布时间】:2017-04-16 21:58:58
【问题描述】:

假设我有一个这样的 DataFrame:

df = pd.DataFrame({'consumption':['squirrel eats apple', 'monkey eats apple', 
                                  'monkey eats banana', 'badger eats banana'], 
                   'food':['apple', 'apple', 'banana', 'banana'], 
                   'creature':['squirrel', 'badger', 'monkey', 'elephant']})

    consumption creature    food
0   squirrel eats apple squirrel    apple
1   monkey eats apple   badger  apple
2   monkey eats banana  monkey  banana
3   badger eats banana  elephant    banana

我想在“消费”列中找到“生物”和“食物”组合出现的行,即如果苹果和松鼠一起出现,则为真,但如果苹果与大象一起出现,则为假。同样,如果 Monkey 和 Banana 同时出现,则为 True,但 Monkey-Apple 为 false。

我尝试的方法是这样的:

creature_list = list(df['creature'])
creature_list = '|'.join(map(str, creature_list))

food_list = list(df['food'])
food_list = '|'.join(map(str, food_list))

np.where((df['consumption'].str.contains('('+creature_list+')', case = False)) 
          & (df['consumption'].str.contains('('+food_list+')', case = False)), 1, 0)

但这不起作用,因为我在所有情况下都得到 True。

如何检查字符串对?

【问题讨论】:

    标签: python string pandas boolean-expression


    【解决方案1】:

    这是一种可能的方法:

    def match_consumption(r):
        if (r['creature'] in r['consumption']) and (r['food'] in r['consumption']):
            return True
        else:
            return False
    
    df['match'] = df.apply(match_consumption, axis=1)
    df
    
               consumption  creature    food  match
    0  squirrel eats apple  squirrel   apple   True
    1    monkey eats apple    badger   apple  False
    2   monkey eats banana    monkey  banana   True
    3   badger eats banana  elephant  banana  False
    

    【讨论】:

    • 嘿@foglerit,谢谢,问题-如果r['consumption'] 在另一个数据框中说x['consumption'],我修改函数以在参数中添加x,这仍然有效吗?
    • 刚刚用两个数据框试了一下,得到了这个错误:TypeError: 'Series' objects are mutable, thus they cannot be hashed 但根据我提出的问题,你的答案是正确的。我没有在我的问题中完全抓住问题。
    • @vagabond,如果consumption 在另一个数据框中,您需要先合并两个 DF,然后才能应用此方法。
    • 真的没有匹配的字段 - 这就是为什么我试图在消费列中找到另外两个字符串。
    • 如果没有匹配的字段,那么您必须有两个行对齐的 DF。如果是这种情况,您可以使用 pd.concat 水平连接它们
    【解决方案2】:

    检查字符串是否太简单了?您可以测试字符串<creature> eats <food> 是否等于consumption 列中的相应值:

    (df.consumption == df.creature + " eats " + df.food)
    

    【讨论】:

      【解决方案3】:

      我确信有更好的方法来做到这一点。但这是一种方式。

      import pandas as pd
      import re
      
      df = pd.DataFrame({'consumption':['squirrel eats apple', 'monkey eats apple', 'monkey eats banana', 'badger eats banana'], 'food':['apple', 'apple', 'banana', 'banana'], 'creature':['squirrel', 'badger', 'monkey', 'elephant']})
      
      test = []
      for i in range(len(df.consumption)):
          test.append(bool(re.search(df.creature[i],df.consumption[i])) & bool((re.search(df.food[i], df.consumption[i]))))
      df['test'] = test
      

      【讨论】:

        猜你喜欢
        • 2021-10-27
        • 1970-01-01
        • 2011-11-09
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 2013-03-13
        • 2021-12-20
        • 2014-09-17
        相关资源
        最近更新 更多