python - 使用 Python ,如何查询 json 格式列中的元素并将它们变成行?
问题描述
我的 sql server 数据库中有一个我没有创建的表,看起来像这样。
经理编号 | 员工信息 |
---|---|
123567890123 | [{'emp_name':'ash','emp_id':'123'},{{'emp_name':'brad','emp_id':'234'}] |
235678901234 | [{'emp_name':'sarah','emp_id':'345'},{{'emp_name':'ryan','emp_id':'456'}{{'emp_name':'chris','emp_id' :'567'}] |
我查询了这张表并进入了熊猫数据框。我想为每个经理获取每个 emp_name 和 emp_id 下面是我想要的结果。
经理编号 | emp_name | emp_id |
---|---|---|
123567890123 | 灰 | 123 |
123567890123 | 布拉德 | 234 |
235678901234 | 莎拉 | 345 |
235678901234 | 瑞安 | 456 |
235678901234 | 克里斯 | 567 |
解决方案
您可以使用.explode()
将 json 列表扩展为每行一个的单个 json。然后,用于pd.Series
将 json 转换为列。
df2 = df.explode('employee info').reset_index(drop=True)
df_out = df2.join(df2['employee info'].apply(pd.Series)).drop('employee info', axis=1)
为了获得更好的性能,您可以使用pd.DataFrame()
而不是pd.Series
将json转换为列,如下所示:
pd.DataFrame(df2['employee info'].tolist())
emp_name emp_id
0 ash 123
1 brad 234
2 sarah 345
3 ryan 456
4 chris 567
整套代码如下:
df2 = df.explode('employee info').reset_index(drop=True)
df_out = df2.join(pd.DataFrame(df2['employee info'].tolist())).drop('employee info', axis=1)
数据输入
data = {'manager id': [123567890123, 235678901234],
'employee info': [[{'emp_name':'ash','emp_id':'123'},{'emp_name':'brad','emp_id':'234'}],
[{'emp_name':'sarah','emp_id':'345'},{'emp_name':'ryan','emp_id':'456'}, {'emp_name':'chris','emp_id':'567'}]]}
df = pd.DataFrame(data)
输出:
print(df_out)
manager id emp_name emp_id
0 123567890123 ash 123
1 123567890123 brad 234
2 235678901234 sarah 345
3 235678901234 ryan 456
4 235678901234 chris 567
推荐阅读
- python - TypeError:无法将 cuda:0 设备类型张量转换为 numpy。使用 Tensor.cpu() 先将张量复制到主机内存(Segmentation using yolact edge)
- azure - Azure 发布管道在路径中找不到工件
- reactjs - 使用外部按钮控制 react-youtube 播放器
- python - 为什么当我显示 ROC 时,它显示我的第一类 ROC 是 nan?
- excel - 如何在Excel中获取彩色单元格的总和
- c - 如何在 C 和 C++ 中使用反斜杠作为分隔符?
- c# - 如何为 TextAsset 创建一个包装器并在 ScriptedImporter 中分配它?
- javascript - spawn 不是函数
- vim - 如何在执行 :Vexplore 并在新缓冲区中打开文件后自动关闭 netrw 窗格?
- powershell - Powershell从网页获取数据