将列添加到 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=1
和 numeric_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
)
我有一个包含以下内容的 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=1
和 numeric_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
)