使用条件pandas数据帧解析dict中的数据



My pandas DataFrame有一些缺失和错误的值。我想通过解析存储在pandas系列中的字典中的数据来替换/填充它。这里有一个例子:

import pandas as pd
df = pd.DataFrame({'Addr': ['123 Street, City, 85036', '234 Street1, City, 85036', '542js'],
'Lat': [32.312, 33.312, np.nan],
'CL':  [{'street':'134 Street name',
'city':'City name',
'zip':'85312',
'latitude': 34.661056,
'longitude': -118.146189},
{'street':'134 Street name',
'city':'City name',
'zip':'85312',
'latitude': 34.661056,
'longitude': -118.146189},

{'street':'134 Str',
'city':'phx',
'zip':'85312',
'latitude': 34.661056,
'longitude': -118.146189}]
})

对于Latnp.nan的行,我想解析CL列中的数据。在填充dict中的数据后,该行的2列将如下所示:

Addr               Lat
134 Str phx 85312  34.661056 

事实上,格言相当长。因此,我更喜欢一种只提取所需值的方法,在这种情况下是Latstreetcityzip,它们构成了Addr列。

您可以规范化"CL"列,并将新创建的列连接到"Addr"one_answers"Lat"。然后将Lat的值更改为"纬度",此处为np.nan:

df = df[['Addr', 'Lat']].join(pd.json_normalize(df['CL']))
df.loc[df['Lat'].isna(), 'Lat'] = df.loc[df['Lat'].isna(), 'latitude']
print(df)

输出:

Addr        Lat           street       city    zip   latitude   longitude
0   123 Street, City, 85036  32.312000  134 Street name  City name  85312  34.661056 -118.146189
1  234 Street1, City, 85036  33.312000  134 Street name  City name  85312  34.661056 -118.146189
2                     542js  34.661056          134 Str        phx  85312  34.661056 -118.146189

编辑:在阅读了你的评论和编辑后的问题后,你似乎不想构建这样一个巨大的df,而是在你的字典里工作:

your_dict = {'Addr': ['123 Street, City, 85036', '234 Street1, City, 85036', '542js'],
'Lat': [32.312, 33.312, np.nan],
'CL':  [{'street':'134 Street name',
'city':'City name',
'zip':'85312',
'latitude': 34.661056,
'longitude': -118.146189},
{'street':'134 Street name',
'city':'City name',
'zip':'85312',
'latitude': 34.661056,
'longitude': -118.146189},

{'street':'134 Str',
'city':'phx',
'zip':'85312',
'latitude': 34.661056,
'longitude': -118.146189}]
}
df_lat = pd.Series(your_dict['Lat'])
df_cl = pd.DataFrame(your_dict['CL'])  
print(df_cl.loc[df_lat.isna(), ['latitude', 'street', 'city', 'zip']])

这样,只有"Lat"最初等于np.nan的行才会被考虑:

latitude   street city    zip
2  34.661056  134 Str  phx  85312

如果只需要一列,则

>>> df['Lat'] = df['Lat'].fillna(pd.DataFrame(df['CL'].tolist())['latitude'])
>>> df
Addr        Lat                                                 CL
0   123 Street, City, 85036  32.312000  {'street': '134 Street name', 'city': 'City na...
1  234 Street1, City, 85036  33.312000  {'street': '134 Street name', 'city': 'City na...
2                     542js  34.661056  {'street': '134 Str', 'city': 'phx', 'zip': '8...

如果dict对于内存来说太长,那么您可以使用for循环解析它,转换为df,然后填充

keys = []
for i in df['CL'].tolist():
keys.append({'Lat': i['Lat'], 'street': i['street'],'city': i['city'],'zip': i['zip']})
ddf = pd.DataFrame(keys)

相关内容

  • 没有找到相关文章

最新更新