我想从子组合计中获得每一行的百分比。首先,我为数据帧创建了bin,然后进行分组。
我有以下数据帧:
data = pd.DataFrame({'barrio':['Almagro','Palermo','Almagro','Almagro','Palermo','Palermo','Almagro','Almagro'],
'fuente':['A','A','B','B','B','A','B','A'],
'valor':[1,6,5,3,5,10,8,4]})
bins = np.arange(0,data['valor'].max() + 1, 2)
labels = ['-'.join(map(str,(x,y))) for x, y in zip(bins[:-1], bins[1:])]
data['bins'] = pd.cut(data['valor'], bins=bins,labels = labels, include_lowest=True)
data = data.groupby(['barrio','fuente','bins']).agg({'valor':'count'})
data = data.groupby(level=0).apply(lambda x: 100 * x / float(x.sum()))
预期的结果将是:
valor
barrio fuente bins
Almagro A 0-2 50.00
2-4 50.00
4-6 0.00
6-8 0.00
8-10 0.00
B 0-2 0.00
2-4 33.00
4-6 33.00
6-8 33.00
8-10 0.00
Palermo A 0-2 0.00
2-4 0.00
4-6 50.00
6-8 0.00
8-10 50.00
B 0-2 0.00
2-4 0.00
4-6 100.00
6-8 0.00
8-10 0.00
但我得到的结果是:
valor
barrio fuente bins
Almagro A 0-2 20.00
2-4 20.00
4-6 0.00
6-8 0.00
8-10 0.00
B 0-2 0.00
2-4 20.00
4-6 20.00
6-8 20.00
8-10 0.00
Palermo A 0-2 0.00
2-4 0.00
4-6 33.33
6-8 0.00
8-10 33.33
B 0-2 0.00
2-4 0.00
4-6 33.33
6-8 0.00
8-10 0.00
我该如何解决这个问题呢?
谢谢!
发布于 2021-11-02 14:27:48
您可以在normalize
中使用value_counts
data.groupby(['barrio', 'fuente'])['bins'].value_counts(normalize=True)
输出:
barrio fuente bins
Almagro A 0-2 0.500000
2-4 0.500000
B 2-4 0.333333
4-6 0.333333
6-8 0.333333
Palermo A 4-6 0.500000
8-10 0.500000
B 4-6 1.000000
Name: bins, dtype: float64
或者您可以使用crosstab
,它在后台使用上面的代码:
pd.crosstab([data['barrio'],data['fuente']],
data['bins'], normalize='index'
).stack()
输出:
barrio fuente bins
Almagro A 0-2 0.500000
2-4 0.500000
4-6 0.000000
6-8 0.000000
8-10 0.000000
B 0-2 0.000000
2-4 0.333333
4-6 0.333333
6-8 0.333333
8-10 0.000000
Palermo A 0-2 0.000000
2-4 0.000000
4-6 0.500000
6-8 0.000000
8-10 0.500000
B 0-2 0.000000
2-4 0.000000
4-6 1.000000
6-8 0.000000
8-10 0.000000
dtype: float64
https://stackoverflow.com/questions/69811979
复制相似问题