Pandas循环中按月汇总% Change列值的问题求助
问题分析与解决
错误原因拆解
第一个循环执行两次的问题
你写的month=("10")并不是元组,Python里单元素元组必须加逗号,比如month=("10",)。不加逗号的话,("10")等价于字符串"10",len(month)会返回2(因为"10"有两个字符),所以循环跑了两次,每次都用整个字符串"10"去匹配,自然两次结果完全一样。第二个循环总和为0的问题
当month=("10","11")时,你的循环条件写的是Ticker_Ch['Date'].dt.strftime('%m') == month——这里是拿日期字符串和元组("10","11")做比较,字符串永远不可能等于元组,所以筛选出的df2是空DataFrame,求和自然是0.0。你应该用month[x]来获取当前循环的单个月份值。
修正后的循环代码
如果一定要用循环实现,代码应该改成这样:
# 定义1-12月的字符串格式列表,更直观 months = ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"] cum_month = [0.0]*12 # 初始化全0列表,索引0对应1月,完美匹配需求 for idx, month in enumerate(months): # 筛选当前月份的数据 df_month = Ticker_Ch[Ticker_Ch['Date'].dt.strftime('%m') == month] # 计算总和并赋值到对应位置 cum_month[idx] = df_month['% Change'].sum() print(cum_month)
更高效的Pandas原生方案(推荐)
你的数据最多有200万行,用循环效率极低,Pandas的向量化分组操作速度快得多:
# 提取月份(1-12的整数),按月份分组求和 monthly_sum = Ticker_Ch.groupby(Ticker_Ch['Date'].dt.month)['% Change'].sum() # 生成1-12月的完整列表,无数据的月份自动补0 cum_month = [monthly_sum.get(i, 0.0) for i in range(1, 13)] print(cum_month)
这个方法利用Pandas内部优化,比循环快几个数量级,完全适配大数据量场景。
内容的提问来源于stack exchange,提问作者Mario V
相关产品推荐
相关产品推荐

