如何计算Pandas DataFrame/Numpy数组中值的连续重复均值
解决连续重复次数统计及均值计算问题
方法一:使用Pandas实现
步骤1:识别连续重复组并统计次数
通过生成分组标记区分连续相同的AOI片段,再统计每个片段的长度:
import pandas as pd import numpy as np a = np.array([55, 55, 69, 151, 151, 151, 103, 151, 151, 103]) df = pd.DataFrame(a, columns=["AOI"]) # 生成连续相同值的分组ID:当前值与前一个不同时,分组ID递增 df['group_id'] = df['AOI'].ne(df['AOI'].shift()).cumsum() # 按分组ID和AOI分组,计算每组长度(即连续重复次数) segment_counts = df.groupby(['group_id', 'AOI']).size().reset_index(name='count')
执行后得到各连续段的统计结果:
| group_id | AOI | count |
|---|---|---|
| 1 | 55 | 2 |
| 2 | 69 | 1 |
| 3 | 151 | 3 |
| 4 | 103 | 1 |
| 5 | 151 | 2 |
| 6 | 103 | 1 |
步骤2:计算各AOI的连续重复次数均值
按AOI分组后对连续次数求均值:
aoi_mean = segment_counts.groupby('AOI')['count'].mean()
得到的均值结果:
AOI 55 2.0 69 1.0 103 1.0 151 2.5 Name: count, dtype: float64
步骤3:生成目标numpy数组
创建全0数组并填充对应索引的均值:
# 初始化长度为151的全0数组 result = np.zeros(151, dtype=np.float64) # 将均值填充到对应AOI值的索引位置 for aoi, mean_val in aoi_mean.items(): result[aoi] = mean_val
方法二:纯Numpy实现(无需Pandas)
如果仅使用numpy处理原始数组:
import numpy as np from collections import defaultdict a = np.array([55, 55, 69, 151, 151, 151, 103, 151, 151, 103]) # 找到连续段的分割点 split_points = np.where(np.diff(a) != 0)[0] + 1 split_points = np.concatenate([[0], split_points, [len(a)]]) # 计算每个连续段的长度和对应AOI值 segment_lengths = np.diff(split_points) segment_values = a[split_points[:-1]] # 统计每个AOI的所有连续长度并计算均值 aoi_lengths = defaultdict(list) for val, length in zip(segment_values, segment_lengths): aoi_lengths[val].append(length) aoi_mean = {val: np.mean(lengths) for val, lengths in aoi_lengths.items()} # 生成目标数组 result = np.zeros(151, dtype=np.float64) for val, mean_val in aoi_mean.items(): result[val] = mean_val
内容的提问来源于stack exchange,提问作者thyhmoo
相关产品推荐
相关产品推荐

