如何按组用相同code字符填充DataFrame中的NA值?
按组填充缺失的code值
问题描述
我有如下数据集,希望按Keya分组,将code列中的'NA'值填充为同组内一致的code字符。示例中第一个'NA'应填充为'S',第二个'NA'应填充为'F'。数据集及预处理代码如下:
df = {'Key': ['111*1', '111*2','111*3', '222*1','222*2', '333*1','333*2', '333*3','333*4', '444*1'], 'code': ['S', 'S','NA', 'M','M', 'F','F', 'F','NA', 'C']} # 创建DataFrame df = pd.DataFrame(df) df[['Keya', 'Keyb']] = df['Key'].str.split('\\*', expand=True, regex=True) print(df)
解决方案
可以通过以下步骤实现按组填充:
- 先将字符串形式的'NA'转换为pandas标准缺失值
NaN - 按
Keya分组,用组内的非缺失值填充所有缺失项(因为同组内code值一致,直接取组内有效值即可)
完整代码如下:
import pandas as pd df = {'Key': ['111*1', '111*2','111*3', '222*1','222*2', '333*1','333*2', '333*3','333*4', '444*1'], 'code': ['S', 'S','NA', 'M','M', 'F','F', 'F','NA', 'C']} # 创建DataFrame df = pd.DataFrame(df) df[['Keya', 'Keyb']] = df['Key'].str.split('\\*', expand=True, regex=True) # 将字符串'NA'转为NaN df['code'] = df['code'].replace('NA', pd.NA) # 按Keya分组,用组内有效值填充缺失值 df['code'] = df.groupby('Keya')['code'].transform(lambda x: x.ffill().bfill()) print(df)
代码说明
replace('NA', pd.NA):把数据中字符串类型的'NA'替换成pandas能识别的缺失值,方便后续填充操作groupby('Keya')['code'].transform(...):按Keya分组后,对每组的code列执行填充。ffill().bfill()组合可以确保无论缺失值在组的哪个位置,都能被组内的有效值填充(因为同组code值一致,所以取第一个或最后一个有效值都可以,这里用双向填充更稳妥)
运行后,code列的两个缺失值会被正确填充为对应组的'S'和'F'。
内容的提问来源于stack exchange,提问作者AAA
相关产品推荐
相关产品推荐

