【问题标题】:Pandas - Distinct list of values from Pandas column's regex groups [duplicate]Pandas - 来自 Pandas 列正则表达式组的不同值列表 [重复]
【发布时间】:2020-03-01 19:53:15
【问题描述】:

我在 Pandas 数据框中拥有所有英语维基百科文章的第一行,我想将括号中提到的语言提取到一个不同的列表中。

例如:

text
A cat (Afrikaans: kat, German: katze) is an animal.
This line does not contain anything.
A dog (Afrikaans: hond, German: hund, Some language: dog) is an animal.

我想要一份带有['Afrikaans', 'German', 'Some language'] 的列表。

也不确定如何为 df.text.str.extract(r'(\w+):') 之类的东西指定支持正则表达式的 unicode

有人对如何做到这一点有任何想法吗?

【问题讨论】:

  • 您需要支持 unicode 还是只需要输入中列出的输出?你的例子没有说清楚。
  • 我假设很多语言名称中都会包含有趣的字符,所以基本上抓住 : 之前的任何内容,包括 unicode 字符和空格。
  • Python3 支持 unicode,因此您可以明确列举各种可能性。或者,您可以实现“在冒号之前、逗号之后和括号之间获取任何内容”的逻辑
  • 使用正则表达式你通常必须说re.UNICODE之类的东西,我是说我不知道​​如何用 Pandas 做到这一点
  • Series.str.extract 中的 flags 参数不起作用吗? pandas.pydata.org/pandas-docs/stable/reference/api/…

标签: regex python-3.x pandas


【解决方案1】:

这是我的建议:

  1. 将括号中的文本提取为一列
  2. 从第 1 列中提取所有大写单词,分组到一个列表中
  3. 从第 2 列中展平列表并获得不同

这里是:

text = \
["A cat (Afrikaans: kat, German: katze) is an animal.", 
"A dog (Afrikaans: hond, German: hund, Some language: dog) is an animal."]

df = pd.DataFrame(text, columns=['text'])
df['in_parentheses'] = df['text'].str.extract("\(([^)]+)\)")
df['languages'] = df['in_parentheses'].str.extractall("([A-Z]\w+)").groupby(level=0)[0].apply(list)

set(sum(df['languages'], []))

得到:

{'Afrikaans', 'German', 'Some'}

【讨论】:

    猜你喜欢
    • 2022-07-15
    • 2020-01-21
    • 2021-07-27
    • 2019-08-28
    • 2021-10-05
    • 1970-01-01
    • 2021-07-01
    • 2022-01-24
    • 2018-04-06
    相关资源
    最近更新 更多