繁体   English   中英

在 pandas dataframe 中使用 groupby 计算组的百分比

[英]Compute percentage for group using groupby in pandas dataframe

在以下 dataframe 中:

country admin_1 admin_2 year    season_name production  area
A1  B1  C1  1991    Primary 43170   25980
A1  B1  C1  1990    Primary 45624   29820
A1  B1  C1  1989    Primary 56310   31284
A1  B1  C1  1988    Primary 33523   24832
A1  B1  C1  1987    Primary 49388   33479
A1  B1  C1  1986    Primary 36475   27425
A1  B1  C1  1985    Primary 32278   32046
A1  B1  C1  1984    Primary 52073   28929
A1  B1  C1  1983    Primary 51746   32855
A1  B1  C2  1991    Primary 32010   20010
A1  B1  C2  1990    Primary 52704   19520
A1  B1  C2  1989    Primary 65240   18640
A1  B1  C2  1988    Primary 11570   17800
A1  B1  C2  1987    Primary 51282   20350
A1  B1  C2  1986    Primary 25808   19816
A1  B1  C2  1985    Primary 16935   18817
A1  B2  C3  1987    Primary 51282   20350
A1  B2  C3  1986    Primary 25808   19816
A1  B2  C3  1985    Primary 16935   18817

我想通过平均每个 admin_2 的所有年份的面积来确定每个 admin_2 的面积百分比,然后他们计算百分比。 这是我尝试过的:

df['area_percentage'] = df.groupby(['country', 'admin_2'])['area'].apply(lambda x: x / x.sum())

尝试:

df['area_percentage'] = df['area'] /  df.groupby(['country', 'admin_2'])['area'].transform('sum') * 100 

好吧,由于这个问题有些模糊,我会做一些心理锻炼。

让我们看看如何通过平均每个 admin_2 的所有年份的面积来解释“每个 admin_2 的面积百分比”

看着第一次尝试,这被认为是错误的,我可以想出这样的事情:

s = df.groupby(['country', 'admin_2'])['area'].mean()
s /= s.sum() 

Output:

country  admin_2
A1       C1         0.432095
         C2         0.281167
         C3         0.286738

但它看起来很奇怪。 标准化手段有什么好处? 我不知道。 所以让我们跳过它,做一些不同的事情。

如果我们admini_2分组的所有年份的area相加并将结果除以总area会怎样?

s = df.groupby(['country', 'admin_2'])['area'].sum()
s /= s.sum()

Output:

country  admin_2
A1       C1         0.578936
         C2         0.293003
         C3         0.128061

好吧,如果area的性质意味着积累,它可能会起作用。 在这种情况下,我们可以讨论每个admin_2的总area百分比。

但是,如果桌子上没有“积累”怎么办? 假设面积是指一年中必要时必须完成的工作量。 在这种情况下,我们可以这样解释请求:year比较每个admin_2area 从提供的数据中,我可能会得出结论, countryadmin_1并不重要。 它们对于每个admin_2都是相同的,所以我想它们可以被忽略(否则,我们只需将它们添加到 pivot 表索引中)。 在这种情况下,我会做这样的事情:

_df = df.pivot('admin_2','year','area')
_df = (_df / _df.sum()).T

display(_df.fillna(0).style.format('{0:.0%}'.format))
_df.plot(kind='bar'))

Output:

阴谋

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM