Python如何使用数据框应用方法查找列的平均值

时间:2015-04-07 20:25:02

标签: python numpy pandas

这是关于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.applynumpy.mean的组合,因为这就是我刚学到的内容。有什么想法吗?

谢谢!

5 个答案:

答案 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()

熊猫0.22.0 https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.mean.html

  

DataFrame.mean (axis = None,skipna = None,level = None,numeric_only = None,   ** kwargs)

     

...

     

numeric_only :boolean,default None仅包含float,int,boolean   列。 如果为None,将尝试使用所有内容,然后仅使用   数字数据。没有为系列实现。