如何用Pandas依据另一列对应值填充DataFrame同列空白值
在Pandas中基于关联列填充同列空白值
问题场景
需要根据Acc num列的关联值(含格式变体,如100250--与100250属于同一账户组),填充Bank name列的NaN值。
初始DataFrame
| Acc num | Bank name |
|---|---|
| 100250-- | NaN |
| 100250 | NaN |
| 100250 | NaN |
| 100250 | SBI |
| 200100 | NaN |
| 200100 | NaN |
| 200100 | ICICI |
| 200100 | NaN |
期望输出
| Acc num | Bank name |
|---|---|
| 100250-- | SBI |
| 100250 | SBI |
| 100250 | SBI |
| 100250 | SBI |
| 200100 | ICICI |
| 200100 | ICICI |
| 200100 | ICICI |
| 200100 | ICICI |
解决方案
步骤1:标准化账户编号
先统一Acc num的格式,提取核心数字部分,确保同账户条目能被正确分组:
import pandas as pd # 构造初始数据 df = pd.DataFrame({ 'Acc num': ['100250--', '100250', '100250', '100250', '200100', '200100', '200100', '200100'], 'Bank name': [pd.NA, pd.NA, pd.NA, 'SBI', pd.NA, pd.NA, 'ICICI', pd.NA] }) # 清理账户编号:移除所有非数字字符 df['Acc num cleaned'] = df['Acc num'].str.replace(r'\D', '', regex=True)
步骤2:分组填充NaN
按清理后的账户编号分组,用组内非空值填充所有NaN:
# 分组后先向前填充、再向后填充,覆盖所有空白 df['Bank name'] = df.groupby('Acc num cleaned')['Bank name'].transform(lambda x: x.ffill().bfill()) # 可选:删除临时清理列 df = df.drop('Acc num cleaned', axis=1)
验证结果
执行代码后打印输出:
print(df)
得到结果:
Acc num Bank name 0 100250-- SBI 1 100250 SBI 2 100250 SBI 3 100250 SBI 4 200100 ICICI 5 200100 ICICI 6 200100 ICICI 7 200100 ICICI
补充说明
- 若账户编号格式完全统一,可跳过清理步骤,直接按原始
Acc num分组填充。 ffill().bfill()组合能确保不管非空值在组内的哪个位置,所有NaN都会被覆盖。
内容的提问来源于stack exchange,提问作者Pythonguy
相关产品推荐
相关产品推荐

