pandas从groupby和size获得标准化值?

时间:2018-03-05 07:54:16

标签: python pandas

我知道我们可以从大熊猫系列的value_counts()获得标准化值,但是当我们在数据框上执行分组时,获取计数的唯一方法是通过size()。有没有办法用size()获得规范化的值?

示例:

df = pd.DataFrame({'subset_product':['A','A','A','B','B','C','C'],
                   'subset_close':[1,1,0,1,1,1,0]})
df2 = df.groupby(['subset_product', 'subset_close']).size().reset_index(name='prod_count')

df.subset_product.value_counts()
A    3
B    2
C    2

DF2

enter image description here

希望得到:

subset_product subset_close prod_count norm
A              0            1          1/3
A              1            2          2/3
B              1            2          2/2
C              1            1          1/2
C              0            1          1/2

subset_product 除了手动计算标准化值为prod_count / total之外,有没有办法获得标准化值?

1 个答案:

答案 0 :(得分:2)

我认为不可能只有一个groupby + size,因为groupby由2列subset_productsubset_close组成,需要size subset_product仅用于规范化。

Series的可能解决方案为maptransformdf2div的大小相同:

df2 = df.groupby(['subset_product', 'subset_close']).size().reset_index(name='prod_count')
s = df.subset_product.value_counts()
df2['prod_count'] = df2['prod_count'].div(df2['subset_product'].map(s))

或者:

df2 = df.groupby(['subset_product', 'subset_close']).size().reset_index(name='prod_count')
a = df2.groupby('subset_product')['prod_count'].transform('sum')
df2['prod_count'] = df2['prod_count'].div(a)
print (df2)
  subset_product  subset_close  prod_count
0              A             0    0.333333
1              A             1    0.666667
2              B             1    1.000000
3              C             0    0.500000
4              C             1    0.500000