python - 提取 pandas 中包含多行和多列的 JSON 字符串列的部分

标签 python json regex python-3.x pandas

我有一个数据框,其中 parameters 列是 JSON,并且包含多个实际行和列:

input_data = pandas.DataFrame({'id':['0001','0002','0003'],
                               'parameters':["{'product':['book','cat','fish'],'person':['me','you']}",
                                             "'{'product':['book','cat'],'person':['me','you','us']}'",
                                             "'{'product':['apple','snake','rabbit','octopus'],'person':['them','you','us','we','they']}'"]})

...我想从中提取以下数据帧:

product_data = pandas.DataFrame({'id':['0001','0001','0001','0002','0002','0003','0003','0003','0003'],
                                'product':['book','cat','fish','book','cat','apple','snake','rabbit','octopus']})


person_data = pandas.DataFrame({'id':['0001','0001','0002','0002','0002','0003','0003','0003','0003','0003'],
                                'person':['me','you','me','you','us','them','you','us','we','they']})

下面是我如何利用正则表达式来实现这一目标。我怀疑这是最好的方法,但它是这样的:

for i in input_data.id.tolist():
    s = ''.join(input_data[input_data.id == i]['parameters'])
    product_string = re.search(r"product':(.*?),'person", str(s)).group(1)
    product_data = pandas.DataFrame(product_string[1:-1].split(','))
    person_string = re.search(r"person':(.*?)}", str(s)).group(1)
    person_data = pandas.DataFrame(person_string[1:-1].split(','))
    print("........")
    print(product_data)
    print("........")
    print(person_data)

我想学习一种更快、更优雅或更有益健康的解决方案,它可以捕获意想不到的细微差别。

最佳答案

首先,使用 str.get 设置您的产品和人员访问器

input_data['products'] = input_data.parameters.str.get('product')

现在,对于 Pandas >= 0.25.0 ,您可以使用explode方法

input_data.explode('products')

对于 Pandas <= 0.25.0 ,您可以引用to this thread

<小时/>

我假设您的数据框中有字典,而不是您在此处公开的字符串

如果你有字符串,你可能总是

import ast
input_data.parameters.apply(ast.literal_eval)

使它们成为真正的词典。

关于python - 提取 pandas 中包含多行和多列的 JSON 字符串列的部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57192086/

相关文章:

javascript - SQLike - 了解基础知识

jquery - ASP MVC JsonResult 呈现为页面,而不是通过调用 jQuery 函数捕获

Javascript RegExp 根据内容更改行

c# - 如何在 C# 中使用正则表达式获取某个特定单词之前的数字?

python - 为什么 max() 函数在比较 2 个元素时比直接用 if 语句比较慢得多?

python - 构造函数在python中是否继承

python - Python 中的动态过程

python - 如何将变量的值放入字符串中(将其插入字符串中)?

json - 为蛇形 ADT 配置了 JsonCodec

c# - 匹配 wwR ("acddca” ) 在 C# 中使用正则表达式示例