You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 14:57:03