Pandas分箱分组后计算子组内各行占小计百分比的问题
解决方法
问题根因
- 百分比计算的分组层级错误:原代码按
barrio一级索引求和作为分母,得到的是每行占对应barrio全部数据的比例,而预期是占barrio + fuente二级子组的比例。 - 分组计数后未补全不存在的
(barrio, fuente, bins)组合,导致层级展示错位、缺失0值行。
修正后完整代码
import pandas as pd import numpy as np 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_count = data.groupby(['barrio','fuente','bins']).agg({'valor':'count'}) # 补全所有层级组合,缺失值填充为0 all_index = pd.MultiIndex.from_product( [data['barrio'].unique(), data['fuente'].unique(), labels], names=['barrio', 'fuente', 'bins'] ) data_count = data_count.reindex(all_index, fill_value=0) # 按barrio + fuente二级子组计算百分比 data_result = data_count.groupby(level=[0,1]).apply(lambda x: round(100 * x / x.sum(), 2)) print(data_result)
运行上述代码即可得到符合预期的输出结果。
内容的提问来源于stack exchange,提问作者Mato
相关产品推荐
相关产品推荐

