You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用循环填充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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 12:10:30