Pandas:基于type列匹配值替换id列中的NIL值
问题
现有一个包含10万+行、10+列的DataFrame,需基于type列的匹配值填充id列中的NIL值。具体约束如下:
id列值不唯一,部分行的id和type均为NIL- 记录顺序不可更改(因包含日期相关列)
- 所有空值已统一填充为
NIL - 仅需尽可能替换
id列的NIL值,type列的NIL无需处理,其余内容保持不变 - 要求无需循环实现
当前DataFrame示例:
| COL1 | id | type | COL4 | COL5 |
|---|---|---|---|---|
| NIL | 123 | moving | NIL | NIL |
| ... | 123 | lend | ... | ... |
| NIL | 456 | penny | ... | NIL |
| ... | NIL | appendix | NIL | ... |
| ... | 251 | appendix | ... | ... |
| NIL | NIL | lend | ... | NIL |
| ... | 665 | NIL | NIL | ... |
| ... | NIL | NIL | ... | ... |
| ... | 251 | retailer | NIL | NIL |
| NIL | 251 | appendix | ... | NIL |
| NIL | 456 | NIL | ... | NIL |
预期DataFrame示例:
| COL1 | id | type | COL4 | COL5 |
|---|---|---|---|---|
| NIL | 123 | moving | NIL | NIL |
| ... | 123 | lend | ... | ... |
| NIL | 456 | penny | ... | NIL |
| ... | 251 | appendix | NIL | ... |
| ... | 251 | appendix | ... | ... |
| NIL | 123 | lend | ... | NIL |
| ... | 665 | NIL | NIL | ... |
| ... | NIL | NIL | ... | ... |
| ... | 251 | retailer | NIL | NIL |
| NIL | 251 | appendix | ... | NIL |
| NIL | 456 | NIL | ... | 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
相关产品推荐
相关产品推荐

