首页 > 解决方案 > 在pandas中提取包含多行和多列的JSON字符串列的部分

问题描述

我有一个数据框,其中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)

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

标签: pythonjsonregexpython-3.xpandas

解决方案


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

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

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

input_data.explode('products')

对于熊猫<= 0.25.0,你可以参考这个帖子


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

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

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

使它们成为真正的字典。


推荐阅读