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