首页 > 解决方案 > 使用 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

标签: pythonpandasdataframepysparkdata-transform

解决方案


您可以使用.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

推荐阅读