pandas 将包含数组列的 Dataframe 添加到新 Dataframe

cwxwcias  于 2022-12-21  发布在  其他
关注(0)|答案(1)|浏览(136)

事实上,我有一个feather文件,即时载入到一个数据框。
这个数据框有一列,每行都有languages,就像abone:
| 学生标识|姓名|创建时间|语言|
| - ------| - ------| - ------| - ------|
| 1个|富|2019年1月3日14时30分32.146000 + 00时|[{"语言标识":1、"名称":"英文"、"optin_......"|
| 第二章|酒吧|2019年1月3日14时30分32.146000 + 00时|[{"语言标识":1、"名称":"英文"、"optin_......"|
我的问题是:如何仅使用student_id列和languages数组的其余部分生成新的 Dataframe ?
例如上面这个:
| 学生标识|语言标识|语言名称|选择|
| - ------| - ------| - ------| - ------|
| 1个|1个|英语|2019年1月3日14时30分32.148秒|
| 第二章|1个|英语|2021年5月30日上午00时33分02秒915秒|
| 第二章|第二章|葡萄牙语|2022年3月7日星期一07:42:07.082中文|
//编辑:
出于测试目的,将 Dataframe 导出为JSON(orient='records'):

[{"student_id":"1","name":"Foo","created_at":"2019-01-03T14:30:32.146Z","languages":[{"language_id":1,"name":"English","optin_at":"2019-01-03T14:30:32.148Z"}]},{"student_id":"2","name":"Bar","created_at":"2019-01-03T14:30:32.146Z","languages":[{"language_id":1,"name":"English","optin_at":"2021-05-30T00:33:02.915Z"},{"language_id":2,"name":"Portuguese","optin_at":"2022-03-07T07:42:07.082Z"}]}]
krcsximq

krcsximq1#

您可以使用explode,然后使用json_normalize转换为列:

out = (df
  .explode('languages', ignore_index=True)
  .pipe(lambda d: d.join(pd.json_normalize(d.pop('languages'))
                           .rename(columns={'name': 'language_name'})
                        ))
)

输出:

student_id name                created_at  language_id language_name                  optin_at
0          1  Foo  2019-01-03T14:30:32.146Z            1       English  2019-01-03T14:30:32.148Z
1          2  Bar  2019-01-03T14:30:32.146Z            1       English  2021-05-30T00:33:02.915Z
2          2  Bar  2019-01-03T14:30:32.146Z            2    Portuguese  2022-03-07T07:42:07.082Z

相关问题