如何在满足分组条件时为DataFrame列填充同组的首个有效值?
按分组填充DataFrame空值解决方案
当前DataFrame
| Column A | Column B |
|---|---|
| 1 | 100 |
| 1 | NaN |
| 1 | NaN |
| 2 | 150 |
| 2 | NaN |
| 2 | NaN |
| 3 | NaN |
| 3 | NaN |
| 4 | 60 |
| 5 | 70 |
| 5 | NaN |
期望处理后的DataFrame
| Column A | Column B |
|---|---|
| 1 | 100 |
| 1 | 100 |
| 1 | 100 |
| 2 | 150 |
| 2 | 150 |
| 2 | 150 |
| 3 | NaN |
| 3 | NaN |
| 4 | 60 |
| 5 | 70 |
| 5 | 70 |
实现代码
使用Pandas的groupby结合transform可以实现需求,核心逻辑是按Column A分组后,用每组第一个非NaN值填充组内所有空值,全NaN的分组保持不变:
import pandas as pd import numpy as np # 构造示例数据 df = pd.DataFrame({ 'Column A': [1,1,1,2,2,2,3,3,4,5,5], 'Column B': [100, np.nan, np.nan, 150, np.nan, np.nan, np.nan, np.nan, 60, 70, np.nan] }) # 分组填充逻辑 df['Column B'] = df.groupby('Column A')['Column B'].transform( lambda x: x.fillna(x.dropna().iloc[0]) if not x.dropna().empty else x ) print(df)
代码解释
groupby('Column A'):将DataFrame按Column A的取值划分为多个分组transform:保证分组处理后的结果能映射回原DataFrame的每一行,维持原数据结构- 匿名函数逻辑:
- 先判断分组内是否存在非NaN值(
x.dropna().empty) - 若存在,提取第一个非NaN值(
x.dropna().iloc[0])并填充组内所有NaN - 若分组内全是NaN,则保持原数据不变
- 先判断分组内是否存在非NaN值(
替代写法
也可以通过first_valid_index()获取第一个有效值的索引,实现相同效果:
df['Column B'] = df.groupby('Column A')['Column B'].transform( lambda x: x.fillna(x.loc[x.first_valid_index()]) if x.first_valid_index() is not None else x )
内容的提问来源于stack exchange,提问作者brickeber
相关产品推荐
相关产品推荐

