Python Pandas:循环生成移动平均列时列名命名错误修正求助
修正后的代码及问题说明
原代码存在两个关键问题:
return frame被错误地放在了内层循环中,导致函数仅处理第一个列的第一个移动窗口后就直接返回,后续的列和窗口计算完全没有执行。- 若实际生成的列名是
原列名+字典值(如A5),说明代码中可能误将拼接字段写成了value而非key,需要确认列名拼接逻辑是col + '_' + key。
修正后的完整代码:
import pandas as pd import numpy as np toy_df = pd.DataFrame(data=np.random.rand(50,4), columns = ('Time', 'A', 'B' ,'C')) window_size = {'ma_5': 5, 'ma_4': 4, 'ma_3': 3, 'ma_2': 2, 'ma_1': 1} def calculate_ma(frame): # 遍历除Time外的所有列 for col in frame.columns.drop('Time'): # 遍历每个窗口配置 for key, value in window_size.items(): # 按「原列名_字典键」格式生成新列名,并计算移动平均 frame[f"{col}_{key}"] = frame[col].rolling(window=value).mean() # 所有计算完成后再返回DataFrame return frame # 调用函数并查看结果 result_df = calculate_ma(toy_df) print(result_df.columns)
修正点说明
- 调整return语句位置:将
return frame移到外层循环之外,确保所有列和窗口的移动平均计算完成后再返回结果。 - 明确列名拼接逻辑:使用f-string(
f"{col}_{key}")更清晰地生成原列名_字典键格式的列名,避免字符串拼接错误。 - 简化窗口字典定义:直接在字典中定义窗口大小,无需单独定义变量,让代码更简洁。
运行修正后的代码后,生成的列名将符合预期(如A_ma_5、B_ma_3等),且所有列的所有窗口移动平均都会被正确计算。
内容的提问来源于stack exchange,提问作者byc
相关产品推荐
相关产品推荐

