Python如何使用dataframes apply方法查找列的平均值

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

这是一个关于Udacity数据科学纳米学位的问题,我想不出来。说明如下:

使用dataframe的apply方法,创建一个名为“平均奖牌数”的新系列,该系列表示在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\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,这样每种类型至少获得一枚奖牌,因为这是读者的练习,你应该一次解决一个问题