Python 将列添加到包含先前数据平均值的数据帧的末尾

Python 将列添加到包含先前数据平均值的数据帧的末尾,python,pandas,dataframe,calculated-columns,Python,Pandas,Dataframe,Calculated Columns,我有一个数据框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 我想在此数据框中添加另一列,其中包含

我有一个数据框
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列)


您可以使用
copy()
复制df,然后只需调用
mean
并传递参数
axis=1
numeric\u 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)
其中轴=1表示行操作(使用每行的列值计算“平均”列中的平均值)

然后,您可能需要按此列进行排序:

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

其中inplace=True表示对数据帧应用操作,而不是对副本进行计算。

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

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
)

复制部分仅在您希望执行更多操作时才需要,例如,以一种或多种格式保存到文件并进行打印,同时避免覆盖旧变量(这是一个很好的做法),因此从这个意义上说,这是一个更一般的答案,而您的答案更为重要。
data_with_ave = ave_data.assign(
                    average = ave_data.mean(axis=1, numeric_only=True),
                    isLarge = lambda df: df['average'] > 10
)