【问题标题】:check str.contains in pandas using string from series使用系列中的字符串检查熊猫中的 str.contains
【发布时间】:2014-11-01 18:51:05
【问题描述】:

为什么这不适用于使用 pandas 的字符串方法?

df['col1'].str.contains(df['col2'])

不断得到:“系列”对象是可变的,因此它们不能被散列。

更新:澄清一下 - 我会逐行比较这些列,并让部分字符串按顺序完全匹配。例如,对于下面的第 1 列和第 2 列,我希望上面的输出与输出中一样:

col-1    col-2    output
'cat'    'at'     True
'aunt'   'at'     False
'dog'    'dg'     False
'edge'   'dg'     True

【问题讨论】:

  • contains 需要一个模式,我想你想要.isin 所以df['col1'].isin(df['col2'])
  • 我觉得你需要df['col1'].isin(df['col2'].values),对吧?
  • 所以我只想匹配字符串的一部分也没关系? 'mn' isin 'mnxn' 会是真的吗?
  • 不,isin 完全匹配,部分匹配你必须使用contains,我会更新我的答案来演示
  • 谢谢@EdChum。我需要澄清 - 我想将一列中的值与另一列中的值逐行匹配。所以在你下面的 [77] 中,行索引 4 应该是 False ......因为“xa”中没有“q”。此外,它必须是特定于订单的。如果第一栏说“ant”,第二栏说“at”,那么答案就是“假”。但如果第一列说“猫”,它应该是“真”。

标签: python string pandas


【解决方案1】:

您可以使用 lambda 函数在数据帧中按行执行任何操作。

对于您的问题:

>> df = pd.DataFrame({'col-1':['cat','aunt','dog','edge'], 'col-2':['at','at','dg','dg']})

>> df
 col-1 col-2
0   cat    at
1  aunt    at
2   dog    dg
3  edge    dg

>> df['output'] = df.apply(lambda row : row['col-2'] in row['col-1'], axis=1)

>> df
  col-1 col-2  output
0   cat    at    True
1  aunt    at   False
2   dog    dg   False
3  edge    dg    True

这里 lambda 函数将对 col-1 和 col-2 执行逐行字符串比较,并将结果存储在“输出”列中。

同样的概念也可以用于对数据帧执行数学运算。

【讨论】:

    【解决方案2】:

    您可以定义一个简单的函数,然后只测试一列中的一个值是否在另一列中:

    In [37]:
    
    df = pd.DataFrame({'col1':['mn','mxn','ca','sd','xa','ac'], 'col2':['m','n','x','n','q','y']})
    def func(x):
        return x.col2 in list(x.col1)
    df.apply(func, axis=1)
    Out[37]:
    0     True
    1     True
    2    False
    3    False
    4    False
    5    False
    dtype: bool
    

    对于您的用例,以下应该做您想做的事:

    return x.col2 in x.col1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-31
      • 2020-09-19
      • 1970-01-01
      • 2018-03-12
      • 2020-03-07
      • 2021-05-15
      • 1970-01-01
      • 2018-06-04
      相关资源
      最近更新 更多