You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:22:53