计算表中每 x 行的平均值并创建新表

2025-03-05 09:18:00
admin
原创
2
摘要:问题描述:我有一张很长的数据表(约 200 行乘 50 列),我需要创建一个代码来计算表中每两行和每列的平均值,最终输出是一个新的平均值表。这在 Excel 中执行显然很疯狂!我使用 python3,并且我知道一些类似的问题:这里、这里和这里。但这些都无济于事,因为我需要一些优雅的代码来处理多列并生成有组织的...

问题描述:

我有一张很长的数据表(约 200 行乘 50 列),我需要创建一个代码来计算表中每两行和每列的平均值,最终输出是一个新的平均值表。这在 Excel 中执行显然很疯狂!我使用 python3,并且我知道一些类似的问题:这里、这里和这里。但这些都无济于事,因为我需要一些优雅的代码来处理多列并生成有组织的数据表。顺便说一下,我原来的数据表是使用 pandas 导入的,并定义为数据框,但在 pandas 中找不到简单的方法来做到这一点。非常感谢您的帮助。

该表的示例(简短版本)如下:

a   b   c   d
2   50  25  26
4   11  38  44
6   33  16  25
8   37  27  25
10  28  48  32
12  47  35  45
14  8   16  7
16  12  16  30
18  22  39  29
20  9   15  47

预期均值表:

a    b     c     d
3   30.5  31.5  35
7   35    21.5  25
11  37.5  41.5  38.5
15  10    16    18.5
19  15.5  27    38

解决方案 1:

df.index//2您可以使用(或者如@DSM 指出的那样,使用np.arange(len(df))//2- 以便它适用于所有索引)创建一个人工组,然后使用 groupby:

df.groupby(np.arange(len(df))//2).mean()
Out[13]: 
      a     b     c     d
0   3.0  30.5  31.5  35.0
1   7.0  35.0  21.5  25.0
2  11.0  37.5  41.5  38.5
3  15.0  10.0  16.0  18.5
4  19.0  15.5  27.0  38.0

解决方案 2:

您可以使用pd.rolling()创建滚动平均值来解决这个问题,然后使用iloc

df = df.rolling(2).mean() 
df = df.iloc[::2, :]

请注意,第一个观察结果将会丢失(即滚动从顶部开始),因此请确保检查您的数据是否按您需要的方式排序。

解决方案 3:

NumPythonic 方法是使用 提取元素作为 NumPy 数组df.values,然后重塑为具有沿和元素3D的数组,并执行沿 的平均缩减,最后转换回数据框,如下所示 -2`axis=14axis=2`axis=1

pd.DataFrame(df.values.reshape(-1,2,df.shape[1]).mean(1))

事实证明,你可以引入 NumPy 非常高效的工具:将其作为和的组合来np.einsum执行此操作,就像这样 -average-reduction`sum-reduction`scaling-down

pd.DataFrame(np.einsum('ijk->ik',df.values.reshape(-1,2,df.shape[1]))/2.0)

请注意,所提出的方法假设行数可以被整除2

另外,为了保留列名,您需要在转换回 Dataframe 时noted by @DSM添加,即 -columns=df.columns

pd.DataFrame(...,columns=df.columns)

样本运行 -

>>> df
    0   1   2   3
0   2  50  25  26
1   4  11  38  44
2   6  33  16  25
3   8  37  27  25
4  10  28  48  32
5  12  47  35  45
6  14   8  16   7
7  16  12  16  30
8  18  22  39  29
9  20   9  15  47
>>> pd.DataFrame(df.values.reshape(-1,2,df.shape[1]).mean(1))
    0     1     2     3
0   3  30.5  31.5  35.0
1   7  35.0  21.5  25.0
2  11  37.5  41.5  38.5
3  15  10.0  16.0  18.5
4  19  15.5  27.0  38.0
>>> pd.DataFrame(np.einsum('ijk->ik',df.values.reshape(-1,2,df.shape[1]))/2.0)
    0     1     2     3
0   3  30.5  31.5  35.0
1   7  35.0  21.5  25.0
2  11  37.5  41.5  38.5
3  15  10.0  16.0  18.5
4  19  15.5  27.0  38.0

运行时测试 -

在本节中,让我们测试迄今为止列出的所有三种解决性能问题的方法,包括@ayhan's solution with groupby

In [24]: A = np.random.randint(0,9,(200,50))

In [25]: df = pd.DataFrame(A)

In [26]: %timeit df.groupby(df.index//2).mean() # @ayhan's solution
1000 loops, best of 3: 1.61 ms per loop

In [27]: %timeit pd.DataFrame(df.values.reshape(-1,2,df.shape[1]).mean(1))
1000 loops, best of 3: 317 µs per loop

In [28]: %timeit pd.DataFrame(np.einsum('ijk->ik',df.values.reshape(-1,2,df.shape[1]))/2.0)
1000 loops, best of 3: 266 µs per loop

解决方案 4:

df.set_index(np.arange(len(df)) // 2).mean(level=0)

解决方案 5:

就你的情况而言,由于你想对行进行平均,因此假设你的数据框名称是new

new = new.groupby(np.arange(len(new)) // 2).mean() 

如果要计算列的平均值

new = new.groupby(np.arrange(len(new.columns)) // 2, axis=1).mean()

解决方案 6:

ValueError: Grouper and axis must be same length当我尝试使用numpy创建人工组时,我得到了。作为替代方案,您可以使用itertools它将生成与您的 Dataframe 长度相等的迭代器:

SAMPLE_SIZE = 2
label_series = pd.Series(itertools.chain.from_iterable(itertools.repeat(x, SAMPLE_SIZE) for x in df.index))
sampled_df = df.groupby(label_series).mean()
相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1323  
  IPD研发管理体系作为一种先进的研发管理理念和方法,对于打造优质产品体验起着至关重要的作用。它涵盖了从产品规划、研发、上市到生命周期管理的全流程,通过整合资源、优化流程、加强团队协作等方式,确保产品能够精准满足用户需求,提升用户满意度和忠诚度。IPD研发管理体系的核心原则IPD研发管理体系以市场驱动为核心原则。这意味着...
IPD集成产品开发   4  
  IPD(Integrated Product Development)产品开发流程作为一种先进的产品开发管理模式,在众多企业中得到广泛应用。它强调跨部门团队协作、并行工程以及基于市场的产品开发理念,旨在提高产品开发效率、缩短产品上市时间、提升产品质量。而成本控制在产品开发过程中至关重要,关乎企业的利润空间和市场竞争力。...
华为IPD流程   3  
  IPD(Integrated Product Development)产品开发流程作为一种先进的产品开发管理模式,在众多企业中得到了广泛应用。它从多个维度对产品开发过程进行优化和整合,为企业创新提供了强大的支撑。通过实施IPD产品开发流程,企业能够更加高效地将创意转化为具有市场竞争力的产品,从而在激烈的市场竞争中占据优...
华为IPD流程管理   2  
  华为作为全球知名的科技企业,其产品质量在市场上有口皆碑。华为IPD产品开发流程在确保产品质量方面发挥了至关重要的作用。IPD(Integrated Product Development)即集成产品开发,是一套先进的、成熟的产品开发管理思想、模式和方法。它打破了传统产品开发中各部门之间的壁垒,强调跨部门团队协作,从产品...
IPD集成产品开发流程   2  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用