【问题标题】:Accessing A series value based on partial match of a string基于字符串的部分匹配访问系列值
【发布时间】:2020-06-26 20:13:46
【问题描述】:

我有一个数据框,它有 2 列。称它为国家/地区,ID

我想获取对应于所选国家值的 ID 值。

但是我想通过字符串变量动态选择 Country 的值,只要字符串变量的某些部分存在于 Country 列中

为了。例如,

s = 'subang - sultan abdu'

我希望它能够在 Country (Malaysia) 中查找 Last row,因为它在那里有部分匹配的“subang”,然后获取相应的 ID。

我试过了:

df.ID[df.Country.str.contains(s, flags =re.IGNORECASE,na= False)].values[0]

因为 Series.contains 默认使用正则表达式搜索来匹配。

但是它没有在这里出现并给出错误。

IndexError: index 0 is out of bounds for axis 0 with size 0

如果我的字符串有效

s = 'kuala lumpur'

df.ID[df.Country.str.contains(s, flags =re.IGNORECASE,na= False)].values[0]

13

任何帮助为什么它给出错误并且没有按照包含的预期进行部分匹配?

【问题讨论】:

  • 可以试试difflib: df.loc[df['Country'].eq(difflib.get_close_matches("subang - sultan abdu",df['Country'],n=1)[0]),'ID']
  • 这是熊猫方法吗?
  • 没有import difflib然后试试
  • 不想导入另一个库。想检查一下这是否可以在没有它的情况下完成
  • 好的,如果您确定字符串将被拆分,下面的答案会建议正确的方法

标签: python pandas


【解决方案1】:

pandas.Series.str.contains: 根据给定模式或正则表达式是否包含在系列或索引的字符串中,返回布尔系列或索引。 [Pandas Documentation]

pandas.Series.str.contains 本身并不寻找部分匹配。但是您可以通过修改正则表达式模式来实现。你得到IndexError,因为当你使用'subang - sultan abdu'作为你的正则表达式模式时,什么都不会匹​​配(因为它会寻找完全匹配)。您必须重建您的正则表达式模式或实施不同的策略。例如,您可以单独搜索每个单词以捕获部分匹配:

# Exact match for "subang" OR "sultan abdu"
df[df.COUNTRY.str.contains('subang|sultan abdu', flags=re.IGNORECASE, na=False)].values[0]

【讨论】:

  • 问题是我通过上面的字符串 's' 匹配模式。它在一个字符串变量中,所以不能像上面那样对其进行硬编码。需要通过该字符串变量进行检查
  • 您可以拆分用户输入的字符串,也许可以去掉特殊字符并加入'|'构建你的正则表达式?
  • 嗯。你认为可能有另一种方式而不必拆分它吗?这是因为它适用于其他字符串。除了这个或少数
  • 您计划如何解析和转换数据的详细信息完全取决于您的特定用例。例如,如果您将“kuala lumpur”转换为“kuala|lumpur”,它仍然可以工作,但您会失去词序;意思是“lumpur kuala”也会匹配。如果可能的话,您可以让用户提供多个输入(由换行符分割?多个输入?由特殊字符分割,例如,或;?),以便您可以保留句子(如果有的话)并用 " |”。有很多解决方案,但我不了解您的应用程序,因此无法进一步评论。
  • 明白。可以说我有一个像“Guinea Rep”这样的字符串。如果我分成两个词,它会得到几内亚和 Rep。如果我这样做 |搜索时,它甚至可能与可能以 Rep 开头或结尾的任何系列值匹配。这会导致错误的匹配。这就是为什么我想知道是否有更好的方法在熊猫系列中进行部分匹配
猜你喜欢
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 2019-02-15
  • 1970-01-01
  • 2019-09-02
相关资源
最近更新 更多