这是关于Udacity Data Science Nanodegree的一个问题,我无法弄明白。说明如下:
使用数据框的apply方法,创建一个名为avg_medal_count
的新系列,表示在2014年索契奥运会上获得至少一枚奖牌的国家中获得的金牌,银牌和铜牌的平均数。
我目前的代码是:
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_medal_count = df.apply(numpy.mean)
,但得到的错误是它无法将第一列转换为有意义的数字,因为第一列是国家/地区列表。我怎样才能在金,银,铜柱上使用df.apply
?我尝试了其他变化,但没有任何效果。我很确定我需要使用df.apply
和numpy.mean
的组合,因为这就是我刚学到的内容。有什么想法吗?
谢谢!
答案 0 :(得分:2)
我首先会修改您将数据导入的方式:
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
最后,将奖牌总数大于或等于1的行的数据框子集,并找到列的平均值。
df[df['medal total'] >= 1].apply(np.mean)
结果:
bronze 3.807692
gold 3.807692
silver 3.730769
medal total 11.346154
这也可以使用以下方法在一行中完成:
df[ df.sum(axis=1) >= 1 ].apply(np.mean)
答案 1 :(得分:2)
我刚刚在熊猫中使用R语言的概念来解决它并且它有效。在#your code here
下试用此代码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
在python 3 IDE(如pycharm)中,你应该使用
return print(avg_count)
然后将主函数放在缩进之外以找到答案
avg_medal_count()
答案 2 :(得分:1)
上述任何一种解决方案都不适用于问题中所述。使用以下内容:
# 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将始终返回错误,原因是文本列'国家'
答案 3 :(得分:1)
avg_medal_count = df[['gold', 'silver', 'bronze']].apply(numpy.mean)
要做到这一点,因为平均值只适用于数字列,而不适用于国家,这是一个字符串......
答案 4 :(得分:1)
avg_medal_count = df.mean()
所有国家/地区都有超过1枚奖牌,因此无需对其进行过滤。如果您需要它:
avg_medal_count = df[(df.gold + df.silver + df.bronze) > 0].mean()
DataFrame.mean (axis = None,skipna = None,level = None,numeric_only = None, ** kwargs)
...
numeric_only :boolean,default None仅包含float,int,boolean 列。 如果为None,将尝试使用所有内容,然后仅使用 数字数据。没有为系列实现。