在pandas中计算行平均值

85
       Y1961      Y1962      Y1963      Y1964      Y1965  Region
0  82.567307  83.104757  83.183700  83.030338  82.831958  US
1   2.699372   2.610110   2.587919   2.696451   2.846247  US
2  14.131355  13.690028  13.599516  13.649176  13.649046  US
3   0.048589   0.046982   0.046583   0.046225   0.051750  US
4   0.553377   0.548123   0.582282   0.577811   0.620999  US
在上述数据框中,我想获得每行的平均值。目前,我的方法是:
df.mean(axis=0)

然而,这样会同时删除地区列。我该如何计算平均值并保留地区列?


你好,能否提供实际情况和期望的结果? - WoodChopper
1
我完全理解为什么有人会认为0代表行,1代表列均值。 - Roman Luštrik
5个回答

160

你可以指定一个新列。同时需要沿着每行计算平均值,所以使用 axis=1

df['mean'] = df.mean(axis=1)
>>> df
       Y1961      Y1962      Y1963      Y1964      Y1965 Region       mean
0  82.567307  83.104757  83.183700  83.030338  82.831958     US  82.943612
1   2.699372   2.610110   2.587919   2.696451   2.846247     US   2.688020
2  14.131355  13.690028  13.599516  13.649176  13.649046     US  13.743824
3   0.048589   0.046982   0.046583   0.046225   0.051750     US   0.048026
4   0.553377   0.548123   0.582282   0.577811   0.620999     US   0.576518

1
谢谢@Alexander,这个方法有效!但是我收到了一个警告信息:正在尝试在DataFrame的切片副本上设置值。请尝试使用.loc[row_indexer,col_indexer] = value。我该如何避免这种情况? - user308827
4
这个操作可以解决警告问题:df = df.assign(mean=df.mean(axis=1))。意思是在DataFrame中添加一个名为"mean"的新列,其值为每行数据的平均值,从而消除警告提示。 - Alexander

25

我们可以使用range函数找到一行的平均值,即在您的情况下,从Y1961列到Y1965列。

df['mean'] = df.iloc[:, 0:4].mean(axis=1)

如果您想选择单独的列

df['mean'] = df.iloc[:, [0,1,2,3,4].mean(axis=1)

6

根据列名求平均值

以下内容可能对那些想要根据列名而不是计算列索引来取几列的平均值的人有用。这可以通过使用pandas的loc而不是iloc轻松完成。例如,要取奇数年的平均值:

df["mean_odd_year"] = df.loc[:, ["Y1961","Y1963","Y1965"]].mean(axis = 1)

5
我认为这是你正在寻找的内容:
df.drop('Region', axis=1).apply(lambda x: x.mean(), axis=1)

我喜欢这个解决方案。虽然它比被接受的答案更复杂,但它可以让你了解如何使用apply函数来自己提取类似的统计数据。 - bing-nagata-smirnov

1
如果您想按列求平均值,请尝试以下方法:
df.drop('Region', axis=1).apply(lambda x: x.mean())

# it drops the Region column
df.drop('Region', axis=1,inplace=True)

我喜欢这个答案,但问题要求按行取平均。 - mj_whales

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接