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

Pandas中使用iloc赋值时匹配TTS列值而非索引值的技术问题

解决DataFrame按指定月份填充现金流的问题

我来帮你搞定这个现金流表的填充问题!你遇到的NaN问题,核心原因是索引对齐导致的赋值不匹配:当你用df_CF.iloc[df_data.TTS, 0] = df_data.REV时,df_data.REV是一个带索引(0、1、2)的Series,而你选中的df_CF行索引是9、12、15,两者无法对齐,所以pandas无法正确赋值,最终返回NaN。

下面给你两种可行的解决方案,按需选择:

方案一:用iloc直接按位置赋值(适合Months与行位置一致的场景)

这种方式直接跳过索引对齐,把REV的值作为纯数组赋值到指定行位置:

import pandas as pd

# 原始资产数据
df_data = pd.DataFrame({'Asset_Id':[1,2,3] ,'REV':[150000.00,200000.00,250000.00] ,'TTS':[9,12,15]})

# 创建初始全零现金流表
df_CF = pd.DataFrame({'Income':[0.00 for n in range(24)], 'Months':range(0,24)})

# 将TTS转为位置数组,REV转为值数组,直接赋值
df_CF.iloc[df_data['TTS'].values, 0] = df_data['REV'].values

执行后,df_CF的第9、12、15行(对应Months=9、12、15)的Income列就会正确填入对应的REV值。

方案二:用loc匹配Months列值(更通用,可读性更强)

如果后续Months列可能和行位置不一致,推荐用这种方式,直接匹配月份值来赋值:

import pandas as pd

df_data = pd.DataFrame({'Asset_Id':[1,2,3] ,'REV':[150000.00,200000.00,250000.00] ,'TTS':[9,12,15]})
df_CF = pd.DataFrame({'Income':[0.00]*24, 'Months':range(0,24)})

# 构建TTS到REV的映射字典
tts_rev_dict = df_data.set_index('TTS')['REV'].to_dict()

# 用map匹配月份,无匹配的保持0
df_CF['Income'] = df_CF['Months'].map(tts_rev_dict).fillna(0)

这种方式不仅简洁,而且避免了行位置和月份值混淆的问题,数据量较大时效率也更高。

为什么你的原代码会出错?

再补充说明下:你的原代码中,df_data.TTS返回的是9,12,15,iloc确实会定位到df_CF的第9、12、15行,但df_data.REV是带索引的Series(索引为0、1、2),pandas会尝试把索引0对应到df_CF的行9,索引1对应行12...显然两者没有匹配关系,所以赋值失败,最终这些位置变成NaN。

内容的提问来源于stack exchange,提问作者Jordi Yu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:39:26