我试图根据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
答案 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