簡體   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