我正在使用一个熊猫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
我的原始数据框中没有任何值。如何解释这种奇怪的行为以及如何解决呢?
这不是获取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,那些发生在给定大陆上只有一个国家的地方。单个数字的样本标准偏差未定义,熊猫默认使用样本标准偏差。(您可以通过调用来获得总体stdev .std(ddof=0)
,这将使您在这些情况下为零。)
您之前在不同位置看到NaN的原因是因为您明确地将其.groups.keys()
作为索引传递。.groups
只是一本字典,所以它.key()
可以是任意顺序。发生的是,您从计算均值,标准差等获得的结果的顺序与从dict获得的键的顺序不同。您无需像以前那样分别计算各种汇总统计信息;您可以一次完成所有操作,.agg
而pandas会确保一切都适合您。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句