我有这个df:
d = {'name':'CompanyABCD' ,
'office_location':[{'office_x':'lat,long','office_y':'lat,long'}] ,
'total_employees':100}
test = pd.DataFrame(d)
测试显示如下:
name office_location total_employees
0 CompanyABCD {'office_x': 'lat,long', 'office_y':... 100
我如何提取信息,使数据帧结果如下:
name office_location total_employees OfficeName LatLong
0 CompanyABCD {'office_x': 'lat,long', 'office_y':... 100 office_x lat,long
0 CompanyABCD {'office_x': 'lat,long', 'office_y':... 100 office_y lat,long
您可以将字典转换为数据帧和melt
,然后将repeating
之后的数据帧连接/分配给字典的length
:
m = pd.DataFrame(test['office_location'].tolist())
.melt(var_name='Office',value_name='LatLong')
out = (test.loc[test.index.repeat(test['office_location'].str.len())]
.reset_index(drop=True).assign(**m))
name office_location
0 CompanyABCD {'office_x': 'lat,long', 'office_y': 'lat,long'}
1 CompanyABCD {'office_x': 'lat,long', 'office_y': 'lat,long'}
total_employees Office LatLong
0 100 office_x lat,long
1 100 office_y lat,long
这里最简单的方法是将字典提取到一个简单的字典列表中,并从中构建一个辅助数据帧,然后将其水平连接到原始数据帧:
aux = pd.DataFrame(test['office_location'].tolist()).stack().reset_index(level=1)
在这一点上,我们有:
level_1 0
0 office_x lat,long
0 office_y lat,long
连接时间:
resul = pd.concat([test, aux.rename(columns={'level_1': 'OfficeName',
'0': 'LatLong'})], axis=1)
获取:
name office_location total_employees OfficeName 0
0 CompanyABCD {'office_x': 'lat,long', 'office_y': 'lat,long'} 100 office_x lat,long
0 CompanyABCD {'office_x': 'lat,long', 'office_y': 'lat,long'} 100 office_y lat,long
但我认为,当你从数据库中提取数据时,在向数据帧提供数据之前,你应该对数据进行预处理