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

Pandas:基于type列匹配值替换id列中的NIL值

问题

现有一个包含10万+行、10+列的DataFrame,需基于type列的匹配值填充id列中的NIL值。具体约束如下:

  • id列值不唯一,部分行的id和type均为NIL
  • 记录顺序不可更改(因包含日期相关列)
  • 所有空值已统一填充为NIL
  • 仅需尽可能替换id列的NIL值,type列的NIL无需处理,其余内容保持不变
  • 要求无需循环实现

当前DataFrame示例:

COL1idtypeCOL4COL5
NIL123movingNILNIL
...123lend......
NIL456penny...NIL
...NILappendixNIL...
...251appendix......
NILNILlend...NIL
...665NILNIL...
...NILNIL......
...251retailerNILNIL
NIL251appendix...NIL
NIL456NIL...NIL

预期DataFrame示例:

COL1idtypeCOL4COL5
NIL123movingNILNIL
...123lend......
NIL456penny...NIL
...251appendixNIL...
...251appendix......
NIL123lend...NIL
...665NILNIL...
...NILNIL......
...251retailerNILNIL
NIL251appendix...NIL
NIL456NIL...NIL

解决方案

以下基于Pandas矢量化操作实现,全程无需循环,适配10万+行的大数据量:

步骤1:构建type到id的映射字典

先筛选出id和type均不为NIL的行,为每个type绑定对应的有效id(示例取每个type首次出现的id,可按需调整逻辑):

# 生成type到id的映射(保留每个type对应的第一个有效id)
type_id_map = df[(df['id'] != 'NIL') & (df['type'] != 'NIL')].drop_duplicates('type', keep='first').set_index('type')['id'].to_dict()

步骤2:定向填充id列的NIL值

仅对id为NIL且type不为NIL的行进行填充,其余行保持原样:

# 精准填充目标行,其他行数据不变
df['id'] = df['id'].where(
    ~(df['id'] == 'NIL') | (df['type'] == 'NIL'),
    df['type'].map(type_id_map)
)

可选逻辑调整

若一个type对应多个id,可改为取出现频率最高的id:

from collections import Counter

# 统计每个type下id的出现频率,取频率最高的id作为映射值
type_id_counts = df[(df['id'] != 'NIL') & (df['type'] != 'NIL')].groupby('type')['id'].apply(Counter)
type_id_map = {k: v.most_common(1)[0][0] for k, v in type_id_counts.items()}

内容的提问来源于stack exchange,提问作者ngnwoenqwl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 02:51:01