Pandas中结合国家代码与分组递增序号填充唯一标识列空值
Pandas 分组独立序号填充空值最优方案
核心采用pandas原生向量化操作实现,无逐行循环,大数据量下性能最优,逻辑如下:
- 仅针对
UNIQUE_IDENTIFIER列的空值行做处理,原有非空值完全保留 - 按
COUNTRY_CODE分组,每个分组内的空值独立生成从1开始的递增序号 - 拼接国家编码、空格、序号作为填充值,替换对应位置的空值
完整实现代码
import pandas as pd import numpy as np # 测试数据构造(和提问中的示例数据完全一致) df = pd.DataFrame({ 'UNIQUE_IDENTIFIER': [1, np.nan, 2, 4, np.nan, np.nan, np.nan, np.nan], 'COUNTRY_CODE': ['CZ', 'CZ', 'SK', 'AE', 'DK', 'CZ', 'DK', 'ES'] }) # 核心填充逻辑 # 定位所有空值行,按国家分组生成从1开始的递增序号 na_mask = df['UNIQUE_IDENTIFIER'].isna() serial_num = df[na_mask].groupby('COUNTRY_CODE').cumcount() + 1 # 生成符合规则的填充值 fill_content = df.loc[na_mask, 'COUNTRY_CODE'] + ' ' + serial_num.astype(str) # 完成空值替换 df.loc[na_mask, 'UNIQUE_IDENTIFIER'] = fill_content
运行结果
执行代码后打印DataFrame,输出和预期效果完全一致:
UNIQUE_IDENTIFIER COUNTRY_CODE 0 1 CZ 1 CZ 1 CZ 2 2 SK 3 4 AE 4 DK 1 DK 5 CZ 2 CZ 6 DK 2 DK 7 ES 1 ES
方案优势
- 全向量化实现,比
apply逐行处理的方案性能高1~2个数量级,十万、百万级数据也能快速跑完 - 逻辑边界清晰,不会误修改原有非空的标识值
- 分组计数自动隔离,不同国家的序号独立从1开始计数,不需要手动维护每个国家的计数器
注意:填充后
UNIQUE_IDENTIFIER列会变为object类型(同时包含数值和字符串值),如果需要统一为字符串格式,可以在填充完成后执行df['UNIQUE_IDENTIFIER'] = df['UNIQUE_IDENTIFIER'].astype(str)做类型转换。
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

