将列添加到 Pandas DataFrame 的末尾,其中包含以前数据的平均值

Add column to the end of Pandas DataFrame containing average of previous data

我有一个包含以下内容的 DataFrame ave_data

ave_data

Time        F7           F8            F9  
00:00:00    43.005593    -56.509746    25.271271  
01:00:00    55.114918    -59.173852    31.849262  
02:00:00    63.990762    -64.699492    52.426017

我想在此数据框中添加另一列,其中包含每行 F7、F8 和 F9 列下的平均值。

ave_data DataFrame 可能会改变大小,因为我的代码稍后会从不同的 Excel 文件中读取,因此该方法需要是通用的(即添加包含平均值的列始终作为最后一列DataFrame,不在列号 4)

desired output

Time        F7           F8            F9           Average
00:00:00    43.005593    -56.509746    25.271271    4.25  
01:00:00    55.114918    -59.173852    31.849262    9.26
02:00:00    63.990762    -64.699492    52.426017    17.24

您可以使用 copy() 获取 df 的副本,然后只需调用 mean 并传递参数 axis=1numeric_only=True 以便计算平均值 -明智并忽略非数字列,当您执行以下操作时,该列总是添加在末尾:

In [68]:

summary_ave_data = df.copy()
summary_ave_data['average'] = summary_ave_data.mean(numeric_only=True, axis=1)
summary_ave_data
Out[68]:
                 Time         F7         F8         F9    average
0 2015-07-29 00:00:00  43.005593 -56.509746  25.271271   3.922373
1 2015-07-29 01:00:00  55.114918 -59.173852  31.849262   9.263443
2 2015-07-29 02:00:00  63.990762 -64.699492  52.426017  17.239096

@LaangeHaare 或任何其他好奇的人,我刚刚对其进行了测试,接受的答案的复制部分似乎是不必要的(也许我遗漏了什么...)

因此您可以通过以下方式简化此操作:

df['average'] = df.mean(numeric_only=True, axis=1)

我本来可以简单地将其添加为评论,但没有声誉

通常情况下,如果您想使用特定的列,您可以使用:

df['average'] = df[['F7','F8']].mean(axis=1)

其中 axis=1 代表按行操作(使用每行的列值计算 'average' 列中的平均值)

那么您可能希望按此列排序:

df.sort_values(by='average',ascending=False, inplace=True)

其中 inplace=True 代表对数据帧应用操作而不是在副本上计算。

df.assign就是专门用于这个目的的。它 returns 一个副本以避免更改原始数据帧 and/or 引发 SettingWithCopyWarning。它的工作原理如下:

data_with_avg = avg_data.assign(
    average = avg_data.mean(axis=1, numeric_only=True)
)

该函数还可以同时创建多个列:

data_with_ave = avg_data.assign(
    average = avg_data.mean(axis=1, numeric_only=True),
    median = avg_data.median(axis=1, numeric_only=True)
)

从 pandas 0.36 开始,您甚至可以引用新创建的列来创建另一个列:

data_with_ave = avg_data.assign(
    average = avg_data.mean(axis=1, numeric_only=True),
    isLarge = lambda df: df['average'] > 10
)