如何存储for循环多列结果到列表?KeyError 1问题求助
解决KeyError及循环结果存储问题
原始DataFrame
import pandas as pd import numpy as np data = {'id':[1,1,2,2,2,3,3,3], 'var':[10,12,8,11,13,14,15,16], 'ave':[2,2,1,4,3,5,6,8], 'age': [10,10,13,13,20,20,20,11], 'weight':[2.5,1.1,2.1,2.2,3.5,3.5,4.2,1.3], 'con': [3.1,2.3,4.5,5.5,6.5,7.5,4.7,7.1]} df = pd.DataFrame(data)
错误原因分析
- 循环范围错误:
for i in [1,6]仅会循环2次(i=1和6),无法实现6次循环的需求。 - 列表赋值错误:空列表
ls初始无任何索引位置,直接用ls[i] = capita[i]会触发索引错误;且capita是DataFrame,不能直接用整数索引取值。 - 计算逻辑笔误:
mul(x.weight, 0)是将con乘以0,导致结果全为0,应为axis=0(按行将con与weight相乘)。
修正后的代码
用列表存储结果
ls = [] # 执行6次循环 for _ in range(6): # 计算age分组的加权平均,修正axis参数 capita = df.groupby('age') \ .apply(lambda x: x[['con']].mul(x.weight, axis=0).sum() / x.weight.sum()) \ .reset_index() \ .rename(columns={"con":"ave"}) # 更新df['ave']为age分组的加权平均 df["ave"] = df["age"].map(df.groupby('age').apply(lambda x: np.average(x['con'], weights=x['weight']))) # 更新df['con']字段 df['con'] = df['var'] * df['ave'] / df.groupby('id')['ave'].transform('sum') # 将本次循环的capita添加到列表 ls.append(capita) # 查看第1次循环的结果 print(ls[0])
用字典存储结果(可选)
若需要通过循环索引快速定位结果,可改用字典:
capita_dict = {} for i in range(6): capita = df.groupby('age') \ .apply(lambda x: x[['con']].mul(x.weight, axis=0).sum() / x.weight.sum()) \ .reset_index() \ .rename(columns={"con":"ave"}) df["ave"] = df["age"].map(df.groupby('age').apply(lambda x: np.average(x['con'], weights=x['weight']))) df['con'] = df['var'] * df['ave'] / df.groupby('id')['ave'].transform('sum') capita_dict[i] = capita # 查看第3次循环的结果(索引从0开始) print(capita_dict[2])
关键修正点
- 用
range(6)实现6次循环,_作为占位符表示无需使用循环变量。 - 用
append()方法向列表添加元素,避免索引错误。 - 修正
mul的axis=0参数,确保加权和计算正确。
内容的提问来源于stack exchange,提问作者mehmo
相关产品推荐
相关产品推荐

