Skip to main content
 首页 » 编程设计

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

2025年05月04日14qlqwjy

这是关于 Udacity 数据科学纳米学位的问题,我无法弄明白。说明是:

使用数据框的 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,因为这是我刚刚学到的。有什么想法吗?

谢谢!

请您参考如下方法:

我会首先修改您将数据导入到的方式:

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 的行对 DataFrame 进行子集化,并求出列的平均值。

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)