python - 在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)
我想学习一种更快、更优雅或有益健康的解决方案,它可能会捕捉到意想不到的细微差别。
解决方案
推荐阅读
- python - Jax 矢量化:vmap 和/或 numpy.vectorize?
- javascript - 模态背景在 laravel 刀片的纵向屏幕方向上阻止模态内容
- ruby-on-rails - Rails:创建动态路由、控制器
- r - 重新排列数据:从上面的内线添加星期数
- scala - pyspark 列中的访问名称
- svg - 箭头不显示在 svg
- android - 在 Kotlin 中通过蓝牙传输大量数据的更好解决方案
- flexbox - flexbox 列中的项目不具有粘性
- php - 如何在 laravel 中不创建对象的情况下访问方法
- sql-server - 填充缺失数据是带有 CTE 的 SQL