在 Pandas DataFrame 的末尾添加一列,该列包含先前数据的平均值。

23

我有一个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 数据框将随着我的代码从不同的Excel文件中读取而改变大小,所以该方法需要是通用的(即始终将包含平均值的列添加为数据框中的最后一列,而不是第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个回答

27

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

16

@LaangeHaare 或其他感兴趣的人,我刚刚测试了一下,接受答案部分的复制似乎是不必要的(也许我漏掉了什么...)

因此,您可以简化为:

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

我本来会把这个作为评论添加,但是声望值不够


2
如果你想进行更多的操作,比如将内容保存到一个或多个格式的文件中并打印,同时又要避免覆盖旧变量(这是一个好的实践),那么复制部分就是必需的。因此,从这个意义上讲,这是一个更通用的答案,而你的答案则更为本质。 - Vincenzooo

11

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

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

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

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

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

其中inplace=True表示在数据框上应用操作,而不是在副本上计算。


3

df.assign 是专门为此目的而设计的。它返回一份副本,以避免更改原始数据帧和/或触发 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
)

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