如何基于其他DF列的组和值获取DF列的相对百分比

时间:2019-07-12 19:41:20

标签: python dataframe

我试图根据DF列的分组和另一个DF列的特定值来获取数据框列的相对百分比。

我正在使用.value_counts()获得每个值的计数,并使用.value_counts(normalize=True) * 100获得相对百分比。问题是,当我在切片相对百分比都为100时使用.value_counts(normalize=True)时。

import pandas as pd

df = pd.DataFrame({'state':['AK','AK','AK','AK','AK','AL','AL','AL','AL','AL'], 'county':['Cnty1','Cnty1','Cnty1','Cnty2','Cnty2','Cnty3','Cnty3','Cnty3','Cnty4','Cnty4'], 'reason':['move','move','vacate','move','vacate','vacate','move','vacate','move','move']})

我得到以下理想结果之一:

StateDF = pd.DataFrame(df.groupby('state')['reason'].value_counts())
StateDF.rename(columns={'reason':'N'}, inplace=True)
StateDF['% of Total'] = df.groupby('state')['reason'].value_counts(normalize=True) * 100

结果:

              N  % of Total
state reason               
AK    move    3        60.0
      vacate  2        40.0
AL    move    3        60.0
      vacate  1        20.0
      vacte   1        20.0

但是,当我尝试做类似的事情但按县分组并仅选择reason == 'move'时,计数是正确的,但相对百分比为100。

CountyDF = pd.DataFrame(df[df['reason']=='move'].groupby(['state','county'])['reason'].value_counts())
CountyDF.rename(columns={'disreasn':'N'}, inplace=True)
CountyDF['% of Total'] = pd.DataFrame(df[df['reason']=='move'].groupby(['state','county'])['reason'].value_counts(normalize=True) * 100)

结果:

                     reason  % of Total
state county reason                    
AK    Cnty1  move         2       100.0
      Cnty2  move         1       100.0
AL    Cnty3  move         1       100.0
      Cnty4  move         2       100.0

1 个答案:

答案 0 :(得分:1)

这取决于您要查看的百分比或分母是多少。在第一个示例中,分母是每个状态内具有“不同原因”的数据,因此它可以工作。 在第二个示例中,分母是每个县和州具有“所有原因”的数据,但是在这里给出“不同原因” ==“移动”时,您在提名人中得到的人口相同。 如果您希望分母是每个州内具有“不同县”的数据,则可以尝试

CountyDF['% of Total'] = pd.DataFrame(df[df['reason']=='move'].groupby(['state'])['county'].value_counts(normalize=True) * 100)

这会让你

                     reason  % of Total
state county reason                    
AK    Cnty1  move         2   66.666667
      Cnty2  move         1   33.333333
AL    Cnty3  move         1   33.333333
      Cnty4  move         2   66.666667