【问题标题】:Groupby function in pandas dataframe of Python does not seem to workPython的熊猫数据框中的Groupby函数似乎不起作用
【发布时间】:2018-04-20 18:40:20
【问题描述】:

我有一张表格,其中包含 15 个国家/地区的各种信息(例如能源供应、可再生能源供应比例)。我必须创建一个数据框,其中包含有关大陆级别的信息,包括每个大陆上的国家数量以及这些大陆上各个国家的人口的平均值、标准差和总和。数据框由上述表格的数据组成。我的问题是,在将 15 个国家映射到各自的大陆之后,我似乎无法汇总大陆级别的数据。我必须使用预定义的字典来解决这个任务。你能帮我解决这个问题吗?请在下面找到我的代码:

def answer_eleven():

import numpy as np
import pandas as pd

Top15 = answer_one()
Top15['Country Name'] = Top15.index

ContinentDict  = {'China':'Asia', 
                  'United States':'North America', 
                  'Japan':'Asia', 
                  'United Kingdom':'Europe', 
                  'Russian Federation':'Europe', 
                  'Canada':'North America', 
                  'Germany':'Europe', 
                  'India':'Asia',
                  'France':'Europe', 
                  'South Korea':'Asia', 
                  'Italy':'Europe', 
                  'Spain':'Europe', 
                  'Iran':'Asia',
                  'Australia':'Australia', 
                  'Brazil':'South America'}

Top15['Continent'] = pd.Series(ContinentDict)
#Top15['size'] = Top15['Country'].count()
Top15['Population'] = (Top15['Energy Supply'] / Top15['Energy Supply per Capita'])
#columns_to_keep = ['Continent', 'Population']
#Top15 = Top15[columns_to_keep]
#Top15 = Top15.set_index('Continent').groupby(level=0)['Population'].agg({'sum': np.sum})
Top15.set_index(['Continent'], inplace = True)
Top15['size'] = Top15.groupby(['Continent'])['Country Name'].count()
Top15['sum'] = Top15.groupby(['Continent'])['Population'].sum()
Top15['mean'] = Top15.groupby(['Continent'])['Population'].mean()
Top15['std'] = Top15.groupby(['Continent'])['Population'].std()
columns_to_keep = ['size', 'sum', 'mean', 'std']
Top15 = Top15[columns_to_keep]
#Top15['Continent Name'] = Top15.index
#Top15.groupby(['Continent'], level = 0, sort = True)['size'].count()

return Top15.iloc[:5]
answer_eleven()

【问题讨论】:

  • 你能print(df.head(10))连同预期的输出吗?从您的代码中不确定是什么问题。
  • 设置Continent为索引有意义吗?
  • @roganjosh:大陆已经在索引中。见行“Top15.set_index(['Continent'], inplace = True)”
  • 抱歉,我的评论措辞不清楚。我的意思是我认为这没有道理,我想知道你为什么这样做。
  • 我认为必须这样做才能使 groupby 功能正常工作。

标签: python python-3.x pandas dataframe pandas-groupby


【解决方案1】:

我相信您需要agg 来按字典聚合:

def answer_eleven():

    Top15 = answer_one()
    ContinentDict  = {'China':'Asia',
                      'United States':'North America',
                      'Japan':'Asia',
                      'United Kingdom':'Europe',
                      'Russian Federation':'Europe',
                      'Canada':'North America',
                      'Germany':'Europe',
                      'India':'Asia',
                      'France':'Europe',
                      'South Korea':'Asia',
                      'Italy':'Europe',
                      'Spain':'Europe',
                      'Iran':'Asia',
                      'Australia':'Australia',
                      'Brazil':'South America'}

    Top15['Population'] = (Top15['Energy Supply'] / Top15['Energy Supply per Capita'])
    Top15 = Top15.groupby(ContinentDict)['Population'].agg(['size','sum','mean','std'])
    return Top15

df = answer_eleven()
print (df)

                        sum          mean           std  size
Country Name                                                 
Asia           2.771785e+09  9.239284e+08  6.913019e+08     3
Australia      2.331602e+07  2.331602e+07           NaN     1
Europe         4.579297e+08  7.632161e+07  3.464767e+07     6
North America  3.528552e+08  1.764276e+08  1.996696e+08     2
South America  2.059153e+08  2.059153e+08           NaN     1

【讨论】:

  • 非常感谢!我刚试了一下,我收到一条错误消息:“KeyError:“['size''sum''mean''std'] not in index”
  • 你用Top15.columns = Top15.columns.droplevel(0)吗?
  • 是的,我用过。这就是我的代码底部现在的样子(不幸的是,我们不允许使用打印功能): Top15 = Top15.groupby(level=0).agg({'Country Name':'count', 'Population' :['sum','mean','std']}) Top15.columns = Top15.columns.droplevel(0) Top15.set_index(['sum', 'mean', 'std', 'count'], dtype='object', inplace = True) return Top15 answer_eleven()
  • 只删除Top15.set_index(['sum', 'mean', 'std', 'count'], dtype='object', inplace = True),仅用于检查;)
  • 我删除了它,但我仍然收到相同的错误消息(KeyError: "['size' 'sum' 'mean' 'std'] not in index")
猜你喜欢
  • 2016-10-09
  • 1970-01-01
  • 2020-08-31
  • 2013-12-19
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-04
  • 2018-08-11
相关资源
最近更新 更多