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

时间:2015-07-29 11:13:40

标签: python pandas dataframe calculated-columns

我有一个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

4 个答案:

答案 0 :(得分:9)

您可以使用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

答案 1 :(得分:3)

@LaangeHaare或其他任何好奇的人,我只是测试了它并且接受答案的副本部分似乎没必要(也许我错过了一些东西......)

所以你可以用以下方法简化:

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

我会简单地将其添加为评论但不具备声誉

答案 2 :(得分:0)

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

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

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

然后您可能要按此列排序:

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

其中inplace = True代表对数据框执行操作,而不是对副本进行计算。

答案 3 :(得分:0)

df.assign专门用于此目的。它返回一个副本以避免更改原始数据帧和/或提高SettingWithCopyWarning。其工作原理如下:

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

此功能还可以同时创建多个列:

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

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

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