python - 将包含键值对的列展开到它们自己的列中
问题描述
我有一个看起来像这样的熊猫数据框:
df = pd.DataFrame({'x':['''[{"key":"Gender","value":["Men"]},
{"key":"Shoe Size","value":["M"]},
{"key":"Shoe Category","value":["Men's Shoes"]},
{"key":"Color","value":["Multicolor"]},
{"key":"Manufacturer Part Number","value":["8190-W-NAVY-7.5"]},
{"key":"Brand","value":["Josmo"]}]''',
'''[{"key":"Gender","value":["Women"]},
{"key":"Size","value":["XL"]},
{"key":"Heel Height","value":["1 Inches"]}]'''],
'y':['A','B']})
它基本上是一个键值对列表,我希望将它们提取到它们自己的列中,并且行之间的键不一致。
关于如何去做的任何想法?
解决方案
这是一个可能的解决方案。但是,您必须事先找出所有可能的键值。我想,它可以通过编程方式完成,但我在这里对它们进行了硬编码。此外,如果有多个有价值的项目,它将采用第一个。
import pandas as pd
import json
# original dataframe
df = pd.DataFrame({'x':['''[{"key":"Gender","value":["Men"]},
{"key":"Shoe Size","value":["M"]},
{"key":"Shoe Category","value":["Men's Shoes"]},
{"key":"Color","value":["Multicolor"]},
{"key":"Manufacturer Part Number","value":["8190-W-NAVY-7.5"]},
{"key":"Brand","value":["Josmo"]}]''',
'''[{"key":"Gender","value":["Women"]},
{"key":"Shoe Size","value":["M"]},
{"key":"Shoe Category","value":["Women's Shoes"]},
{"key":"Color","value":["Multicolor"]},
{"key":"Manufacturer Part Number","value":["8190-W-NAVY-7.5"]}]'''],
'y':['A','B']})
expanded_columns = ['Gender', 'Shoe Size', 'Shoe Category', 'Color',
'Manufacturer Part Number', 'Brand']
# function to create list of values from json text
def json_to_cols(s):
l = json.loads(s)
d = {i:None for i in expanded_columns}
for row in l:
d[row['key']] = row['value'][0]
return list(d.values())
# Create new dataframe with expanded columns
df1 = df.apply(lambda row: pd.Series(json_to_cols(row['x']), index=expanded_columns),
axis=1)
new_df = df.join(df1)
print(new_df)
推荐阅读
- git - 如何列出仅提交到特定目录的 git 分支?
- c++ - 如何将 vscode 指向正确的头文件?
- python - 没有请求的 Django 测试 render_to_string()
- php - 登录woocommerce后在首页看不到价格
- string - 如何从我们从外部源动态发送的字符串中删除“_”
- flutter - video_player 包中的 YouTube 视频
- arrays - 在 Haskell 中有效地迭代多个数组/列表的前缀
- python - 数据框之间的比较:检查一个数据框的列的值是否在另一个数据框的列内的列表中
- tensorflow - MultiHeadAttention (TensorFlow/Keras) 中填充序列的效果
- c++ - 如何只读取文件的一半?