嵌套For与While循环实现DataFrame滚动均值计算的问题求助
解决你的情绪序列均值计算问题
先说说你原来代码里的几个核心问题:
- 外层循环用的
i_i = [0,1,2,3,4,5,6]完全没必要,而且情绪只有4种,这个列表长度不对; i_s和i_e是全局变量,处理第一个情绪时就把它们加到320了,后面的情绪循环直接跳过去了;- 每次赋值
rolling_avg[emotions[i]] = np.mean(...)会覆盖之前的值,最后每个情绪只能得到最后一段的均值,没法存下所有结果。
下面给你两种靠谱的解决方案,按需选就行:
方案一:手动修正循环(清晰易懂)
这个方法和你原来的思路接近,但修正了循环逻辑,把每个情绪的所有均值存成列表再放进字典:
import numpy as np import pandas as pd # 假设my_df是你的原始DataFrame rolling_avgs = {} emotions = ['happy', 'sad', 'bonding', 'leisure'] # 逐个处理每个情绪列 for emotion in emotions: # 获取当前情绪的所有数据(转成numpy数组更方便切片) emotion_scores = my_df[emotion].values emotion_means = [] # 每10个数据为一组计算均值,步长10,从0到320 for start_idx in range(0, 320, 10): end_idx = start_idx + 10 # 取当前组的分数并计算均值 group_mean = np.mean(emotion_scores[start_idx:end_idx]) emotion_means.append(group_mean) # 把当前情绪的所有均值列表存入字典 rolling_avgs[emotion] = emotion_means
如果确实需要每种情绪只取前10组(也就是前100个分数),把range(0, 320, 10)改成range(0, 100, 10)就行,这样每种情绪得到10个均值,总共40个结果。
之后如果要转成DataFrame,一行代码搞定:
# 生成以情绪为列、均值组为行的DataFrame avg_df = pd.DataFrame(rolling_avgs)
方案二:用Pandas内置方法(更简洁高效)
Pandas自带的rolling方法可以直接处理滚动/分组均值,不用手动写嵌套循环,代码更简洁:
# 对所有情绪列计算窗口为10的均值,然后取每10个数据的最后一个均值(即非重叠分组的均值) rolling_avgs_df = my_df.rolling(window=10).mean().iloc[9::10, :] # 重置索引,让行号从0开始更直观 rolling_avgs_df = rolling_avgs_df.reset_index(drop=True)
这里rolling(window=10).mean()会计算滑动窗口的均值,iloc[9::10]是取第9、19、29...行(也就是每个10数据组的最后一个位置对应的均值,刚好是该组的整体均值),完美对应你要的非重叠分组计算需求。
内容的提问来源于stack exchange,提问作者Digital Moniker
相关产品推荐
相关产品推荐

