Python如何使用dataframes apply方法查找列的平均值
这是一个关于Udacity数据科学纳米学位的问题,我想不出来。说明如下: 使用dataframe的apply方法,创建一个名为“平均奖牌数”的新系列,该系列表示在2014年索契奥运会上至少获得一枚奖牌的国家获得的金牌、银牌和铜牌的平均数量 我目前拥有的代码是:Python如何使用dataframes apply方法查找列的平均值,python,numpy,pandas,Python,Numpy,Pandas,这是一个关于Udacity数据科学纳米学位的问题,我想不出来。说明如下: 使用dataframe的apply方法,创建一个名为“平均奖牌数”的新系列,该系列表示在2014年索契奥运会上至少获得一枚奖牌的国家获得的金牌、银牌和铜牌的平均数量 我目前拥有的代码是: import numpy from pandas import DataFrame, Series def avg_medal_count(): countries = ['Russian Fed.', 'Norway', 'Can
import numpy
from pandas import DataFrame, Series
def avg_medal_count():
countries = ['Russian Fed.', 'Norway', 'Canada', 'United States',
'Netherlands', 'Germany', 'Switzerland', 'Belarus',
'Austria', 'France', 'Poland', 'China', 'Korea',
'Sweden', 'Czech Republic', 'Slovenia', 'Japan',
'Finland', 'Great Britain', 'Ukraine', 'Slovakia',
'Italy', 'Latvia', 'Australia', 'Croatia', 'Kazakhstan']
gold = [13, 11, 10, 9, 8, 8, 6, 5, 4, 4, 4, 3, 3, 2, 2, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]
silver = [11, 5, 10, 7, 7, 6, 3, 0, 8, 4, 1, 4, 3, 7, 4, 2, 4, 3, 1, 0, 0, 2, 2, 2, 1, 0]
bronze = [9, 10, 5, 12, 9, 5, 2, 1, 5, 7, 1, 2, 2, 6, 2, 4, 3, 1, 2, 1, 0, 6, 2, 1, 0, 1]
olympic_medal_counts = {'country_name':countries,
'gold': Series(gold),
'silver': Series(silver),
'bronze': Series(bronze)}
df = DataFrame(olympic_medal_counts)
# YOUR CODE HERE
return avg_medal_count
我尝试了两种不同的方法,例如:
avg\u emdal\u count=df.apply(numpy.mean)
,但得到的错误是无法将第一列转换为数字,这是有意义的,因为第一列是国家列表。如何使用df。仅在金、银和铜柱上应用?我尝试过其他的变化,但没有任何效果。我很确定我需要结合使用df.apply
和numpy.mean
,因为这就是我刚刚学到的。有什么想法吗
谢谢 我将首先修改将数据导入到的方式:
df = DataFrame(olympic_medal_counts).set_index('country_name')
然后,我将计算一个新列,其中包含每个国家奖牌总数的行数总和
df['medal total'] = df.sum(axis=1)
结果:
bronze gold silver medal total
country_name
Russian Fed. 9 13 11 33
Norway 10 11 5 26
Canada 5 10 10 25
United States 12 9 7 28
Netherlands 9 8 7 24
Germany 5 8 6 19
Switzerland 2 6 3 11
Belarus 1 5 0 6
Austria 5 4 8 17
France 7 4 4 15
Poland 1 4 1 6
China 2 3 4 9
Korea 2 3 3 8
Sweden 6 2 7 15
Czech Republic 2 2 4 8
Slovenia 4 2 2 8
Japan 3 1 4 8
Finland 1 1 3 5
Great Britain 2 1 1 4
Ukraine 1 1 0 2
Slovakia 0 1 0 1
Italy 6 0 2 8
Latvia 2 0 2 4
Australia 1 0 2 3
Croatia 0 0 1 1
Kazakhstan 1 0 0 1
bronze 3.807692
gold 3.807692
silver 3.730769
medal total 11.346154
最后,为奖牌总数大于或等于1的行对数据帧进行子集,并找到列的平均值
df[df['medal total'] >= 1].apply(np.mean)
结果:
bronze gold silver medal total
country_name
Russian Fed. 9 13 11 33
Norway 10 11 5 26
Canada 5 10 10 25
United States 12 9 7 28
Netherlands 9 8 7 24
Germany 5 8 6 19
Switzerland 2 6 3 11
Belarus 1 5 0 6
Austria 5 4 8 17
France 7 4 4 15
Poland 1 4 1 6
China 2 3 4 9
Korea 2 3 3 8
Sweden 6 2 7 15
Czech Republic 2 2 4 8
Slovenia 4 2 2 8
Japan 3 1 4 8
Finland 1 1 3 5
Great Britain 2 1 1 4
Ukraine 1 1 0 2
Slovakia 0 1 0 1
Italy 6 0 2 8
Latvia 2 0 2 4
Australia 1 0 2 3
Croatia 0 0 1 1
Kazakhstan 1 0 0 1
bronze 3.807692
gold 3.807692
silver 3.730769
medal total 11.346154
这也可以在一条生产线内完成,使用:
df[ df.sum(axis=1) >= 1 ].apply(np.mean)
我刚刚在熊猫中使用了R语言的概念来解决这个问题,它是有效的。请在#您的代码下尝试此代码
sub_df = df[(df.gold >= 1) | (df.silver >= 1) | (df.bronze >= 1)] ### subsetting the data frame
avg_count = sub_df.mean(axis=0) ### axis 0 for column wise mean
return avg_count
在Python3IDE中(比如pycharm),您应该使用
return print(avg_count)
然后将主函数放在缩进之外以找到答案
avg_medal_count()
上述两种解决方案均不适用于问题中所述的情况。使用以下命令:
# YOUR CODE HERE
sub_series = {'gold': df.gold,
'silver': df.silver,
'bronze': df.bronze
}
sub_df = DataFrame(sub_series)
avg_medal_count = sub_df.apply(numpy.mean)
return avg_medal_count
原始df上的应用numpy.mean将始终返回错误,因为文本列为“国家”
avg_medal_count = df[['gold', 'silver', 'bronze']].apply(numpy.mean)
必须这样做,因为平均值将只适用于数字列,而不适用于国家,这是一个字符串…avg\u mondal\u count=df.mean()
所有国家在这一组中都有超过1枚奖牌,因此没有必要对其进行筛选。如果您需要:
平均奖牌数量=df[(df.gold+df.silver+df.brown)>0]。平均值()
熊猫0.22.0
DataFrame.mean(axis=None,skipna=None,level=None,numeric_only=None,
**kwargs)
仅数值\u:布尔值,默认无值仅包括浮点值、整数、布尔值
列如果没有,将尝试使用所有内容,然后仅使用
数字数据。未为系列实现
那么这里有什么限制?我的意思是你可以只做df[['gold','silver','brown']]。apply(np.mean))
或者你可以按数据类型过滤列选择,另一件事是你还需要过滤df,这样每种类型至少获得一枚奖牌,因为这是读者的练习,你应该一次解决一个问题