【问题标题】:Python Pandas - check for substring containment and set new column to substringPython Pandas - 检查子字符串包含并将新列设置为子字符串
【发布时间】:2017-10-03 19:33:23
【问题描述】:

我需要检查字符串包含并将新列设置为子字符串值。我目前正在尝试这个

df['NEW_COL'] = df['COL_TO_CHECK'].str.contains('|'.join(substring_list))

而不是返回 boolean true false 进行遏制...我需要从 substring_list 返回与填充 df['NEW_COL] 匹配的实际值

要检查的子字符串

substring_list = ['apple', 'banana', 'cherry']

生成的数据帧

OLD_COL              NEW_COL
apple pie            apple
black cherry         cherry
banana lemon drop    banana

【问题讨论】:

  • 请分享输入输出示例...

标签: python string pandas


【解决方案1】:

我会这样做:

In [148]: df
Out[148]:
             OLD_COL
0          apple pie
1       black cherry
2  banana lemon drop

In [149]: pat = '.*({}).*'.format('|'.join(substring_list))

In [150]: pat
Out[150]: '.*(apple|banana|cherry).*'

In [151]: df['NEW_COL'] = df['OLD_COL'].str.replace(pat, r'\1')

In [152]: df
Out[152]:
             OLD_COL NEW_COL
0          apple pie   apple
1       black cherry  cherry
2  banana lemon drop  banana

【讨论】:

  • r'\1' 是什么?
  • r'\1' 是第一个捕获的 RegEx 组
  • 您对我上面使用的方法有什么看法? df['COL_TO_CHECK].apply(lambda x: [s for s in substring_list if s in x][0])
  • @AranFreel,哦,我没有注意到评论中的解决方案。我觉得挺好看的……
  • @AranFreel,如果您要搜索单词而不是子字符串,会有更好的选择
【解决方案2】:

您对什么是您的数据以及您想要什么并不是很有洞察力,但一般原则是您可以使用:

df['NEW_COL'] = df['COL_TO_CHECK'].apply(lambda x: do_something(x) if is_something(x) else x)

或者在你的例子中:

substring_list = set(['apple', 'banana', 'cherry'])
df['NEW_COL'] = df['OLD_COL'].apply(lambda x: set(x.split()).intersection(substring_list).pop())

set 更快:)

【讨论】:

  • 此解决方案有效,但我认为这不是最好的方法,为每一行创建一个列表似乎效率不高。 df['COL_TO_CHECK].apply(lambda x: [s for s in substring_list if s in x][0])
  • set 是收容检查的最佳选择,我知道,呵呵 :)
  • 我觉得我的方案更灵活
  • @MaxU 没问题 :) +1 回复你
猜你喜欢
  • 1970-01-01
  • 2015-07-27
  • 2011-11-09
  • 2013-05-18
  • 2022-10-24
  • 2021-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多