【问题标题】:Pandas split string on matching substring from listPandas 在列表中匹配的子字符串上拆分字符串
【发布时间】:2019-07-27 11:37:34
【问题描述】:

我无法找到问题的答案,即如何拆分行中的字符串,这些行中的子字符串与列表中的值匹配(不是数据框的一部分)。换句话说,我需要从 Series 行中拆分/提取与动态列表中的任何值匹配的子字符串。关于如何将这些行标记为 True/False 或如何将匹配项拆分为静态列表,有很多答案,但我一直试图将这两个任务组合在一起。任何帮助将不胜感激。

示例: 系列 - 约翰·多伊先生、简·史密斯女士、神秘博士、诺博士、杜立特博士、X 先生、蝙蝠侠 清单 1 - 博士,博士

输出 - John Doe 先生、Jane Smith 女士、谁、不、Doolittle、X 先生、蝙蝠侠

清单 2 - 先生,先生

输出 - John Doe、Jane Smith 女士、Dr. Who、Dr. No、Doctor Doolittle、X、Batman

【问题讨论】:

  • 能否请您在帖子中包含一个最小数据集以及您想要的输出?
  • @rahlf23 - 我刚刚添加了两个简单的例子

标签: pandas list split


【解决方案1】:
s = pd.Series('Mr. John Doe, Ms. Jane Smith, Dr. Who, Dr. No, Doctor Doolittle, Mister X, Batman'.split(', '))
l = ['Dr. ', 'Doctor ']
list(s.str.replace('({})'.format('|'.join(l)), ''))

Out:
['Mr. John Doe',
 'Ms. Jane Smith',
 'Who',
 'No',
 'Doolittle',
 'Mister X',
 'Batman']
l = ['Mr. ', 'Mister ']
list(s.str.replace('({})'.format('|'.join(l)), ''))

Out:
['John Doe',
 'Ms. Jane Smith',
 'Dr. Who',
 'Dr. No',
 'Doctor Doolittle',
 'X',
 'Batman']

【讨论】:

  • 太棒了。谢谢你。必须有一些优雅的东西来解决这个问题。然而,这种解决方案存在一个实际问题。它只从列表中选择第一个值。即,如果在上面的列表示例中存在“先生”和“夫人”,则此解决方案将选择 Mr 并输出值 's。疑火”为“夫人”。 Doubtfire 行条目。
  • 如果l 列表中的字符串包含以下空格(例如'Mr.[space]'),应该没有问题。例如,如果我有l = ['Mrs. ', 'Mr. ', 'Mister '] 并将'Mrs. Doubtfire' 添加到原始列表中,它可以正常工作,从l 中删除所有项目(因此输出为['John Doe', 'Ms. Jane Smith', 'Dr. Who', 'Dr. No', 'Doctor Doolittle', 'X', 'Batman', 'Doubtfire']
  • 确实可以,但不幸的是,我对列表条目没有权力。除了末尾的句号外,有些条目是相似的。但无论如何,感谢您提供了一个非常实用的解决方案,该解决方案适用于许多其他不那么深奥的情况。
  • 另一件可能有帮助的事情是将较长的匹配字符串放在第一位,例如:pd.Series(['MrJohnDoe', 'MrsDoubtfire']).str.replace('(Mr|Mrs)', '') 结果为['JohnDoe', 'sDoubtfire'],但pd.Series(['MrJohnDoe', 'MrsDoubtfire']).str.replace('(Mrs|Mr)', '') 做正确的事情['JohnDoe', 'Doubtfire']
  • 哦,这可能需要一些努力 :) 我想我会先按字符串的长度以相反的顺序对列表l 进行排序,以便在列表的前面有更长的匹配项,所以MrsMr 等之前被删除。仍然可能在某些情况下它不起作用,但至少这可能是一个很好的起点
猜你喜欢
  • 2013-03-07
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-09-01
  • 2019-04-22
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多