pandas DataFrame通过iloc赋值后打印仍显示全0问题求解
问题根源
- 你使用的
Pack_Dist.iloc[0][i]属于pandas链式索引,这种连续两次取值的操作通常返回的是原DataFrame的副本,你对副本的修改不会同步到原始的Pack_Dist对象上,所以打印出来仍为初始全0值。 - 额外提醒:
[[0]*4]*5是浅拷贝写法,5个内部列表指向同一个内存地址,直接修改嵌套列表会出现一处修改多处生效的问题,转成DataFrame后该影响会被消除,也可以替换为[[0]*4 for _ in range(5)]从根源避免浅拷贝问题。
解决方法
将所有赋值语句的链式索引改为iloc[行索引, 列索引]的单次索引写法,直接修改原DataFrame:
import pandas as pd # 初始化替换为深拷贝写法避免潜在问题,原写法也可正常使用 Pack_Perc = [[0]*4 for _ in range(5)] Pack_Dist = pd.DataFrame(Pack_Perc) for i in range(4): Pack_Dist.iloc[0, i] = my_data.iloc[i+1, 9] Pack_Dist.iloc[1, i] = my_data.iloc[i+1, 11] Pack_Dist.iloc[2, i] = my_data.iloc[i+1, 13] Pack_Dist.iloc[3, i] = my_data.iloc[i+1, 15] Pack_Dist.iloc[4, i] = my_data.iloc[i+1, 17] print(Pack_Dist)
可选优化
可以直接批量提取数据赋值,省略循环,效率更高:
Pack_Dist = my_data.iloc[1:5, [9,11,13,15,17]].T.reset_index(drop=True)
内容的提问来源于stack exchange,提问作者Syrus_M
相关产品推荐
相关产品推荐

