使用循环填充DataFrame零值时出现NaN问题求助
问题描述
我有一个包含零值的DataFrame df1,还有一个由df1按time字段分组得到的DataFrame df2。尝试用df2中的值填充df1里i1列的零值时,结果出现了NaN,使用的代码如下:
for x in df2['time']: df1.loc[(df1['i1'] == 0) & (df1['time']== x),'i1'] = df2[df2['time']==x]['i1']
问题原因
这段代码的核心问题是:df2[df2['time']==x]['i1']返回的是带索引的Series对象,而非单个标量值。直接将其赋值给df1的对应行时,由于索引不匹配,会导致赋值失败,最终出现NaN。
解决方案
方法1:修复循环逻辑
将df2的取值改为提取标量值,比如用.iloc[0]或.values[0]获取对应分组的i1值:
for x in df2['time']: # 提取对应time分组的i1标量值 fill_val = df2[df2['time'] == x]['i1'].iloc[0] df1.loc[(df1['i1'] == 0) & (df1['time'] == x), 'i1'] = fill_val
方法2:使用pandas原生批量映射(推荐)
避免低效循环,利用pandas的批量处理能力,先将df2转为time到i1的字典映射,再填充零值:
# 构建time到i1的映射字典 time_i1_map = df2.set_index('time')['i1'].to_dict() # 替换i1列的零值为对应time的映射值 df1['i1'] = df1['i1'].replace(0, df1['time'].map(time_i1_map))
也可以用where方法实现,逻辑更直观:
df1['i1'] = df1['i1'].where(df1['i1'] != 0, df1['time'].map(time_i1_map))
内容的提问来源于stack exchange,提问作者user21193976
相关产品推荐
相关产品推荐

