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
相关产品推荐
相关产品推荐

