Python 同时创建数据帧拆分列列表
我有这样一个数据帧:Python 同时创建数据帧拆分列列表,python,python-3.x,pandas,dataframe,Python,Python 3.x,Pandas,Dataframe,我有这样一个数据帧: data = {'period':[ [{'periods': [{'From': '19', 'To': '21'}]}, {'periods': [{'From': '13', 'To': '30'}]}, {'periods': [{'From': '02', 'To': '26'}]}], [{'periods': [{'From': '21', 'To': '26'}]}, {'perio
data = {'period':[
[{'periods': [{'From': '19', 'To': '21'}]}, {'periods': [{'From': '13', 'To': '30'}]}, {'periods': [{'From': '02', 'To': '26'}]}],
[{'periods': [{'From': '21', 'To': '26'}]}, {'periods': [{'From': '22', 'To': '27'}]}, {'periods': [{'From': '05', 'To': '07'}]}]
],
'Age':[
['9820', '5480', '8535'],
['1524', '6555', '4555']
],
'Address':[
'2',
'3'
]
}
df = pd.DataFrame(data)
我希望以以下方式转换我的数据集:
data = {'Name':[
{'periods': [{'From': '19', 'To': '21'}]},
{'periods': [{'From': '13', 'To': '30'}]},
{'periods': [{'From': '02', 'To': '26'}]}
,
{'periods': [{'From': '21', 'To': '26'}]},
{'periods': [{'From': '22', 'To': '27'}]},
{'periods': [{'From': '05', 'To': '07'}]}
],
'Age':['9820', '5480', '8535','1524', '6555', '4555'],
'Address':['2', '2', '2', '3', '3', '3']}
df = pd.DataFrame(data)
我正在努力寻找一种方法来同时对两列执行explode()
,以便列周期中列表的第一个元素属于列周期中列表的第一个元素的同一行
期间列表和年龄列表的大小始终相同
我试着这样做:
df = df.reset_index()
uid = df.set_index('index')['period'].explode().reset_index()
df = uid.join(df['Age'].explode())
但它不再显示地址
列
我将感谢任何帮助。谢谢让我们尝试手动分解它们:
names = df.period.explode()
ages = df.Age.explode()
pd.DataFrame({'Name':names, 'Age':ages, 'Address':df.Address.reindex(ages.index)})
输出:
Name Age Address
0 {'periods': [{'From': '19', 'To': '21'}]} 9820 2
0 {'periods': [{'From': '13', 'To': '30'}]} 5480 2
0 {'periods': [{'From': '02', 'To': '26'}]} 8535 2
1 {'periods': [{'From': '21', 'To': '26'}]} 1524 3
1 {'periods': [{'From': '22', 'To': '27'}]} 6555 3
1 {'periods': [{'From': '05', 'To': '07'}]} 4555 3
您可以使用
apply
+explode
:
df.apply(pd.Series.explode).reset_index(drop=True)
非常好的解决方案,谢谢!谢谢你的帮助!
period Age Address
0 {'periods': [{'From': '19', 'To': '21'}]} 9820 2
1 {'periods': [{'From': '13', 'To': '30'}]} 5480 2
2 {'periods': [{'From': '02', 'To': '26'}]} 8535 2
3 {'periods': [{'From': '21', 'To': '26'}]} 1524 3
4 {'periods': [{'From': '22', 'To': '27'}]} 6555 3
5 {'periods': [{'From': '05', 'To': '07'}]} 4555 3