基于ID覆盖DataFrame中t列的NaN值(同ID值需一致)
用同一ID的非NaN值填充DataFrame缺失值的解决方案
嘿,这个需求我之前处理过好多次,用Pandas的分组操作就能轻松搞定,给你两种靠谱的实现方式:
首先先确认你的初始数据:
import pandas as pd df = pd.DataFrame({"t" : [4, 4, 1, 1, float('nan'), 2, 2, 2, float('nan'), 10], "id": [1, 1, 2, 2, 3, 3, 3 , 3, 4, 4]})
方法1:分组后提取组内有效值填充
利用groupby按id分组,然后通过transform对每个组的t列进行填充。因为同一id的t值都是一致的,我们只需要提取组内第一个非NaN值,再填充组内的缺失值即可:
df['t'] = df.groupby('id')['t'].transform(lambda x: x.fillna(x.dropna().iloc[0]))
这里x.dropna().iloc[0]会取出当前组里第一个有效的t值,再用fillna把组内所有NaN替换成这个值,完美匹配你的需求。
方法2:组内前后填充结合
另一种更简洁的方式是利用分组后的向前填充(ffill)和向后填充(bfill)结合,不管NaN出现在组内的开头还是中间,都能被有效值覆盖:
df['t'] = df.groupby('id')['t'].apply(lambda x: x.ffill().bfill())
ffill()会把组内前面的有效值往后填充,bfill()则把后面的有效值往前填充,两者结合就能确保所有NaN都被正确替换。
运行任意一种方法后,你都会得到想要的结果:
print(df) # 输出: # t id # 0 4 1 # 1 4 1 # 2 1 2 # 3 1 2 # 4 2 3 # 5 2 3 # 6 2 3 # 7 2 3 # 8 10 4 # 9 10 4
内容的提问来源于stack exchange,提问作者N08
相关产品推荐
相关产品推荐

