在 Pandas 数据框中查找每三列的平均值

Posted

技术标签:

【中文标题】在 Pandas 数据框中查找每三列的平均值【英文标题】:Find Average of Every Three Columns in Pandas dataframe 【发布时间】:2017-04-19 04:51:18 【问题描述】:

我是 Python 和 Pandas 的新手。我有一个熊猫数据框,其每月列的范围从 2000 (2000-01) 到 2016 (2016-06)。

我想找到每三个月的平均值并将其分配给一个新的季度列 (2000q1)。我知道我可以做到以下几点:

df['2000q1'] = df[['2000-01', '2000-02', '2000-03']].mean(axis=1)
df['2000q2'] = df[['2000-04', '2000-05', '2000-06']].mean(axis=1)
    .
    .
    .
df['2016-02'] = df[['2016-04', '2016-05', '2016-06']].mean(axis=1)

但是,这很乏味。如果有人帮助我找到更好的方法,我将不胜感激。

【问题讨论】:

【参考方案1】:

您可以在列上使用 groupby:

df.groupby(np.arange(len(df.columns))//3, axis=1).mean()

或者,可以将它们转换为日期时间。您可以使用重采样:

df.columns = pd.to_datetime(df.columns)
df.resample('Q', axis=1).mean()

这是一个演示:

cols = pd.date_range('2000-01', '2000-06', freq='MS')
cols = cols.strftime('%Y-%m')
cols
Out: 
array(['2000-01', '2000-02', '2000-03', '2000-04', '2000-05', '2000-06'], 
      dtype='<U7')

df = pd.DataFrame(np.random.randn(10, 6), columns=cols)

df
Out: 
    2000-01   2000-02   2000-03   2000-04   2000-05   2000-06
0 -1.263798  0.251526  0.851196  0.159452  1.412013  1.079086
1 -0.909071  0.685913  1.394790 -0.883605  0.034114 -1.073113
2  0.516109  0.452751 -0.397291 -0.050478 -0.364368 -0.002477
3  1.459609 -1.696641  0.457822  1.057702 -0.066313 -0.910785
4 -0.482623  1.388621  0.971078 -0.038535  0.033167  0.025781
5 -0.016654  1.404805  0.100335 -0.082941 -0.418608  0.588749
6  0.684735 -2.007105  0.552615  1.969356 -0.614634  0.021459
7  0.382475  0.965739 -1.826609 -0.086537 -0.073538 -0.534753
8  1.548773 -0.157250  0.494819 -1.631516  0.627794 -0.398741
9  0.199049  0.145919  0.711701  0.305382 -0.118315 -2.397075

第一种选择:

df.groupby(np.arange(len(df.columns))//3, axis=1).mean()
Out: 
          0         1
0 -0.053692  0.883517
1  0.390544 -0.640868
2  0.190523 -0.139108
3  0.073597  0.026868
4  0.625692  0.006805
5  0.496162  0.029067
6 -0.256585  0.458727
7 -0.159465 -0.231609
8  0.628781 -0.467487
9  0.352223 -0.736669

第二种选择:

df.columns = pd.to_datetime(df.columns)
df.resample('Q', axis=1).mean()

Out: 
   2000-03-31  2000-06-30
0   -0.053692    0.883517
1    0.390544   -0.640868
2    0.190523   -0.139108
3    0.073597    0.026868
4    0.625692    0.006805
5    0.496162    0.029067
6   -0.256585    0.458727
7   -0.159465   -0.231609
8    0.628781   -0.467487
9    0.352223   -0.736669

您可以将其分配给 DataFrame:

res = df.resample('Q', axis=1).mean()

随意更改列名:

res = res.rename(columns=lambda col: 'q'.format(col.year, col.quarter))

res
Out: 
     2000q1    2000q2
0 -0.053692  0.883517
1  0.390544 -0.640868
2  0.190523 -0.139108
3  0.073597  0.026868
4  0.625692  0.006805
5  0.496162  0.029067
6 -0.256585  0.458727
7 -0.159465 -0.231609
8  0.628781 -0.467487
9  0.352223 -0.736669

并通过以下方式将其附加到您当前的 DataFrame:

pd.concat([df, res], axis=1)

【讨论】:

我喜欢你的第二个解决方案,可以将列名更改为 2000q1, 2000q2 ...?, +1 谢谢艾汉。我很感激。 @Peyman 欣赏它的一种方式也是接受解决方案

以上是关于在 Pandas 数据框中查找每三列的平均值的主要内容,如果未能解决你的问题,请参考以下文章

查找数据框中每列的平均值,按标签分组,不包括一个标签

用相关列的平均值替换数据框中的 NaN 值的函数

在 Pandas、Python 中查找具有相同第一列的所有行的最小值、最大值、平均值

用 Python 用该列的平均值减去数据框中的每一列

给定列名,数据框中列的平均值

在 pandas 数据框中获取几年内工作日某个小时的平均值