我正在努力用包含嵌套列表和字典的列规范化数据框。我尝试了zip,json_normlize和爆炸的组合,但均未成功。
以下代码可创建带有嵌套的当前布局示例:
d = {
'user_id': 'user1',
'user_emails': [['user1@workemail.example', 'user1@home_email.example']],
'user_emails_data': [[{'type': 'emailAddress', 'id': 1}, {'type': 'emailAddress', 'id': 2}]] }
df = pd.DataFrame(data = d)
[
答案 0 :(得分:2)
分两步,我们可以使用.explode
和pd.json_normalize
和.join
重新创建您的df。
uid = df.set_index('user_id')['user_emails'].explode().reset_index()
df1 = uid.join(pd.json_normalize(df['user_emails_data'].explode()))
print(df1)
user_id user_emails type id
0 user1 user1@workemail.example emailAddress 1
1 user1 user1@home_email.example emailAddress 2
答案 1 :(得分:0)
这就是我要做的事情:
d['user_emails'] = d['user_emails'][0]
d["user_emails_data"] = d["user_emails_data"][0]
d["user_emails_data_type"] = []
d["user_emails_data_id"] = []
for val in d["user_emails_data"]:
d["user_emails_data_type"].append(val["type"])
d["user_emails_data_id"].append(val['id'])
del d["user_emails_data"]
pd.DataFrame(d)
这将生成:
user_id user_emails user_emails_data_type user_emails_data_id
0 user1 user1@workemail.example emailAddress 1
1 user1 user1@home_email.example emailAddress 2
它假定dict
的其余部分具有相同的结构。