Pandas一对一与一对多表关联拼接及缺失值处理问题咨询
解决方案
你此前使用的方案问题在于:unstack后的列数量由单个iso对应的最多优先级记录数决定,当存在iso优先级数量不足4条或者超过4条时,直接调用set_axis指定固定4个列名会触发列数不匹配报错,同时也没有内置缺失列的空值填充逻辑。
处理逻辑
- 先对优先级表按iso分组,给每个组内的优先级记录生成1-4的顺序编号,超出4条的记录直接丢弃
- 按生成的编号转宽表,补全缺失的priority01-priority04列,空值填充为NULL
- 最后和人口GDP表左关联,得到最终每个iso仅一行的目标表
完整代码示例
import pandas as pd import numpy as np # ---------------------- 处理优先级表 ---------------------- # 如果需要按指定规则排序优先级,可先执行排序(比如按priority字段升序),不需要则跳过该行 table_2 = table_2.sort_values(['iso', 'priority']).reset_index(drop=True) # 给每个iso下的优先级生成顺序编号,从1开始对应priority01的后缀 table_2['priority_rank'] = table_2.groupby('iso').cumcount() + 1 # 仅保留前4个优先级,超出的直接丢弃 table_2 = table_2[table_2['priority_rank'] <= 4] # 转宽表 pivot_priority = table_2.pivot(index='iso', columns='priority_rank', values='priority') # 补全所有需要的4个列,缺失的列填充NaN(对应SQL的NULL) for rank in [1,2,3,4]: if rank not in pivot_priority.columns: pivot_priority[rank] = np.nan # 重命名列名,重置索引 pivot_priority = pivot_priority[[1,2,3,4]].rename(columns={ 1: 'priority01', 2: 'priority02', 3: 'priority03', 4: 'priority04' }).reset_index() # ---------------------- 关联人口GDP表得到最终表 ---------------------- # 假设人口GDP表名为table_1,左连接保证所有iso都被保留,无优先级记录的四个字段自动为NaN final_table = pd.merge(table_1, pivot_priority, on='iso', how='left')
内容的提问来源于stack exchange,提问作者DoctorEXE
相关产品推荐
相关产品推荐

