如何将带嵌套的选举数据字典列表转换为结构正确的Pandas DataFrame
马德里选举数据分组合并解决方案
问题根源
你当前得到的散列多行NaN结果,是因为json_normalize处理partidos字段的列表时,会把列表中每个单独的字典解析为独立行,每个字典仅包含单个政党的字段,其他政党字段默认为NaN。
你用sum()得到的所有行数值相同,是因为你提供的测试样例中不同城市的partidos字段本身填充了相同的测试值,替换为真实爬取数据后该问题会自然消失,但sum()本身存在风险:如果某列出现多个非NaN值会导致计算错误,不是最优方案。agg(', '.join)会将NaN值也作为字符串拼接,不符合需求。
解决方案
方案1:基于现有DataFrame分组合并
使用first()聚合函数提取每个分组下的第一个非NaN值,同时将link加入分组键避免丢失字段:
df_clean = df.groupby(['municipio', 'link'], as_index=False).first()
该方案改动最小,直接基于你已生成的中间表处理即可得到符合预期的结果。
方案2:预处理原始JSON从源头避免生成NaN
在解析JSON阶段就把每个城市的partidos字典列表合并为单个字典,直接生成干净的DataFrame,效率更高:
import pandas as pd processed_list = [] for city_data in results_pruebas_formatted: # 合并单个城市的所有政党信息到同一个字典 party_info = {} for single_party in city_data['partidos']: party_info.update(single_party) # 拼接城市基础信息和政党信息 processed_list.append({ 'municipio': city_data['municipio'], 'link': city_data['link'], **party_info }) # 直接生成无NaN的结果表 df_clean = pd.DataFrame(processed_list)
内容的提问来源于stack exchange,提问作者Ber Tsacianegu del Tepuy
相关产品推荐
相关产品推荐

