【问题标题】:NaN values in the groupby statistics in pandaspandas groupby 统计中的 NaN 值
【发布时间】:2016-12-23 06:43:26
【问题描述】:

我正在使用 pandas DataFrame Top15,其中包含世界上 15 个国家/地区的人口数据。

                      Population
Country                         
China               1.367645e+09
United States       3.176154e+08
Japan               1.274094e+08
United Kingdom      6.387097e+07
Russian Federation  1.435000e+08
Canada              3.523986e+07
Germany             8.036970e+07
India               1.276731e+09
France              6.383735e+07
South Korea         4.980543e+07
Italy               5.990826e+07
Spain               4.644340e+07
Iran                7.707563e+07
Australia           2.331602e+07
Brazil              2.059153e+08

现在我想查看这些数据的大陆统计数据。所以我使用字典创建了一个 groupby 对象:

df = Top15.groupby(ContinentDict)

地点:

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'}

然后我正在创建一个包含各种统计信息的新数据框:

new_df = pd.DataFrame({'size' : df.size().values, 'sum' : df.sum().values, 'mean' : df.mean().values, 'std' : df.std().values}, index = df.groups.keys())

我得到以下输出:

                       mean  size           std           sum
North America  5.797333e+08     5  6.790979e+08  2.898666e+09
Asia           2.331602e+07     1           NaN  2.331602e+07
South America  7.632161e+07     6  3.464767e+07  4.579297e+08
Europe         1.764276e+08     2  1.996696e+08  3.528552e+08
Australia      2.059153e+08     1           NaN  2.059153e+08

如您所见,在标准差列中,有两个 NaN 值(适用于亚洲和澳大利亚)。

在此之后,我尝试查看各个值

df.std()

我得到:

    Asia             6.790979e+08
    Australia                 NaN
    Europe           3.464767e+07
    North America    1.996696e+08
    South America             NaN

Name: Population, dtype: float64

现在亚洲完全没问题,而南美则不然!我的原始数据框中没有任何 NaN 值。如何解释这种奇怪的行为以及如何解决它?

【问题讨论】:

  • 可以加ContinentDict吗?
  • @jezrael :添加了字典。
  • 我现在才意识到最终输出中大陆的大小也是错误的。

标签: python python-3.x pandas group-by


【解决方案1】:

这不是获取 groupby 统计信息的好方法。只需将函数名称列表传递给agg,直接在分组对象上计算统计信息:

>>> d.groupby(ContinentDict).Population.agg(['size', 'mean', 'std', 'sum'])
               size          mean           std           sum
Asia              5  5.797333e+08  6.790979e+08  2.898666e+09
Australia         1  2.331602e+07           NaN  2.331602e+07
Europe            6  7.632161e+07  3.464767e+07  4.579297e+08
North America     2  1.764276e+08  1.996697e+08  3.528553e+08
South America     1  2.059153e+08           NaN  2.059153e+08

(您可以使用字符串,因为您使用的所有函数都是内置的 pandas 方法,因此是特殊情况。如果您想计算任何自定义函数,您将传递实际的函数对象。)

至于 NaN,它们发生在给定大陆上只有一个国家的地方。单个数字的样本标准差未定义,pandas默认使用样本标准差。 (您可以通过调用.std(ddof=0) 来获取总体标准差,这将使您在这些情况下为零。)

您之前在不同地方看到 NaN 的原因是您明确地将 .groups.keys() 作为索引传递。 .groups 只是一个字典,所以它的.key() 可以是任意顺序。发生的事情是,您从计算均值、标准差等中获得的结果与您从字典中获得的键的顺序不同。无需像您一样单独计算各种汇总统计信息;您可以使用 .agg 一次性完成所有操作,pandas 会确保一切都为您对齐。

【讨论】:

  • 我仍然不明白如何在此设置中获得零而不是 NaN。我尝试用std(ddof = 0) 替换std,但它会引发错误。
  • 试试d.groupby(ContinentDict).Population.agg(['size', 'mean', lambda c: c.std(ddof=0), 'sum'])。使用字符串时无法传递参数,因此您必须传递一个只调用 std 并带有额外的 ddof 参数的函数。这将为您的列提供一个不太有用的名称(“”),但您以后可以随时重命名。
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 2019-11-18
  • 2013-08-28
相关资源
最近更新 更多