我有一个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
答案 0 :(得分:9)
您可以使用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
答案 1 :(得分:3)
所以你可以用以下方法简化:
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
)