Pandas按指定列分组后填充另一列组内空值的方法
Pandas按分组填充指定列空值(非众数填充方案)
问题复现
现有两列结构的Pandas DataFrame,数据构造代码如下:
import pandas as pd data = [['A', '3ykf'], ['A', '3ykf'], ['A', ], ['B', ], ['B', '6jbk'], ['B', ], ['B', ], ['C', ], ['C', ]] df = pd.DataFrame(data, columns=['column1', 'column2'])
初始数据形态:
| column1 | column2 |
|---|---|
| A | "3ykf" |
| A | 空值 |
| A | "3ykf" |
| B | 空值 |
| B | 空值 |
| B | "6jbk" |
| B | 空值 |
| C | 空值 |
| C | 空值 |
填充规则
- 同一
column1分组内,column2的非空值为固定的同一个字符串,其余值为空 - 组内所有
column2空值需要填充为该组对应的唯一非空字符串 - 禁止使用众数填充逻辑:部分分组(如B组)中空值占比更高,众数为空值,会导致填充结果不符合预期
- 若分组内
column2无任何非空值(如C组),保留原有空值即可
期望填充结果:
| column1 | column2 |
|---|---|
| A | "3ykf" |
| A | "3ykf" |
| A | "3ykf" |
| B | "6jbk" |
| B | "6jbk" |
| B | "6jbk" |
| B | "6jbk" |
| C | 空值 |
| C | 空值 |
实现代码
核心逻辑为按column1分组后,取每组column2的第一个非空值作为填充值,通过groupby+transform映射回原表,完全避开众数计算:
df['column2'] = df.groupby('column1')['column2'].transform( lambda x: x.fillna(x.dropna().iloc[0] if len(x.dropna()) > 0 else None) )
逻辑说明
groupby('column1')按指定字段拆分数据分组transform会将分组计算结果按原索引映射回每一行,保证输出和原表长度一致- 每组内先丢弃空值:如果存在非空值,取第一个非空值填充组内所有空(根据规则组内非空值完全相同,取第一个即可);如果没有非空值则返回
None保留空状态 - 无众数计算逻辑,不会出现空值占比过高导致填充失效的问题,运行后结果和预期完全匹配。
内容的提问来源于stack exchange,提问作者gblm
相关产品推荐
相关产品推荐

