【问题标题】:Python Pandas regex outputting NaNPython Pandas 正则表达式输出 NaN
【发布时间】:2020-08-06 06:46:59
【问题描述】:

我有一个带有这样字符的 pandas 数据框列(应该是字典,但在抓取到 CSV 后变成了字符串):

{"id":307,"name":"Drinks","slug":"food/drinks"...`

我正在尝试提取“名称”的值,因此在本例中为“饮料”。

我现在的代码(如下所示)不断为整个数据帧输出 NaN。

df['extracted_category'] = df.category.str.extract('("name":*(?="slug"))')

我的正则表达式有什么问题?谢谢!

【问题讨论】:

  • 这将获得第 1 组 "name":"([^"]+)" 中名称的值,但是您可以将其解析为 json 并获取键名称的值吗?
  • 您好,我认为您不需要像?= 那样的前瞻性子句。取而代之的是,您可以更新您的正则表达式并尝试这个:("name":*("\w*"))。测试regex101.com/r/xdHD8t/2

标签: python regex pandas


【解决方案1】:

最好将其转换为数据框,您可以使用 evalpd.Series 来做类似的事情

# sample dataframe
df
                                          category
0  {"id":307,"name":"Drinks","slug":"food/drinks"}

df.category.apply(lambda x : pd.Series(eval(x)))
    id    name         slug
0  307  Drinks  food/drinks

或者使用eval仅将字符串转换为字典

df['category'] = df.category.apply(eval)

df.category.str["name"]
0    Drinks
Name: category, dtype: object

【讨论】:

    【解决方案2】:

    嗨@Ellie 也检查一下这种方法:

    x = {"id":307,"name":"Drinks","slug":"food/drinks"}
    result = [(key, value) for key, value in x.items() if key.startswith("name")]
    print(result)
    [('name', 'Drinks')]
    

    【讨论】:

      【解决方案3】:

      因此,首先 ("name":*(?="slug")) 中最外层的括号需要去掉,因为它们代表第一组,然后提取的值将等于不是的第一组'name' 的值在哪里。

      一个更简单的正则表达式是 "name":"(\w*)" (注意:确保将要提取的正则表达式部分保留在括号内)。此正则表达式查找以下字符串:

          "name":"
      

      并提取其后面的所有字母 (\w*),然后在另一个双引号处停止。

      您可以在以下位置测试您的正则表达式:https://regex101.com/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-10
        • 1970-01-01
        • 2018-04-24
        • 2020-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多