如何使用Pandas基于ID和Wave列的条件填充NaN值?
解决方法:按ID填充Wave=g对应的hiqual值
方法一:建立ID与基准值的映射关系填充
先提取每个ID在Wave='g'时的hiqual值,生成映射关系,再通过ID匹配填充NaN:
import pandas as pd # 构造你的示例数据 data = { 'ID': [1,1,1,2,2,2,3,3,4,4], 'hiqual': [1.0, None, None, 1.0, None, None, 1.0, None, 5.0, None], 'Wave': ['g','i','k','g','i','k','g','i','g','i'] } df = pd.DataFrame(data) # 提取每个ID对应的Wave=g的hiqual基准值 id_hiqual_map = df[df['Wave'] == 'g'].set_index('ID')['hiqual'] # 用基准值填充同一ID下的NaN df['hiqual'] = df['hiqual'].fillna(df['ID'].map(id_hiqual_map))
执行后结果:
| ID | hiqual | Wave |
|---|---|---|
| 1 | 1.0 | g |
| 1 | 1.0 | i |
| 1 | 1.0 | k |
| 2 | 1.0 | g |
| 2 | 1.0 | i |
| 2 | 1.0 | k |
| 3 | 1.0 | g |
| 3 | 1.0 | i |
| 4 | 5.0 | g |
| 4 | 5.0 | i |
方法二:使用groupby分组填充
通过groupby('ID')分组后,直接在组内提取Wave='g'的基准值填充NaN,逻辑更直观:
df['hiqual'] = df.groupby('ID').apply( lambda group: group['hiqual'].fillna(group[group['Wave'] == 'g']['hiqual'].iloc[0]) ).reset_index(drop=True)
注意事项
- 如果存在没有Wave=g记录的ID,上述方法会保留该ID下的NaN,你可以根据需求添加额外处理(比如填充0或其他默认值)。
- 两种方法都能实现需求,第一种映射方式在数据量较大时性能更优,第二种分组方式可读性更强。
内容的提问来源于stack exchange,提问作者newbie_python
相关产品推荐
相关产品推荐

