Pandas分组维度不一致问题:如何统一各分组结果的维度
Pandas分组维度不一致问题:如何统一各分组结果的维度
你现在遇到的问题我懂了——按每个G列(G1/G2/G3/G4)和Tax分组统计值为1的行数时,有些Tax类别因为对应G列全是0,导致最终结果里直接没了这些Tax的记录,结果维度没法统一对吧?我来给你捋捋怎么解决。
首先明确核心需求:要让每个G列的分组结果都包含所有Tax的唯一值,哪怕该G列在这个Tax下没有1,也要显示计数为0。
解决思路&代码实现
1. 先拿到所有Tax的基准列表
首先我们需要先获取DataFrame里所有唯一的Tax值,这是我们要统一的维度基准:
all_taxes = self.instance.df['Tax'].unique()
2. 针对单个G列的处理逻辑
以G1为例,我们换一种统计方式,先筛选出G1=1的行再分组计数,之后用reindex把所有Tax补全,缺失的填充0:
# 第一步:筛选G1值为1的行,按Tax分组统计数量 g1_counts = self.instance.df[self.instance.df['G1'] == 1].groupby('Tax').size() # 第二步:用所有Tax值重新索引,缺失的位置填充0 g1_counts = g1_counts.reindex(all_taxes, fill_value=0) # 第三步:整理成你需要的多级索引格式(G1=1作为上层索引) g1_counts = g1_counts.reset_index().assign(G1=1).set_index(['G1', 'Tax'])[0]
这样处理后,g1_counts就会包含所有Tax类别,没有1的Tax对应的计数就是0,完全符合你期望的结果格式。
3. 封装成函数批量处理所有G列
为了方便处理G1到G4所有列,我们可以把上面的逻辑封装成一个函数:
def get_g_column_counts(df, g_column_name): # 获取所有唯一Tax值 all_taxes = df['Tax'].unique() # 统计当前G列值为1的各Tax计数 tax_counts = df[df[g_column_name] == 1].groupby('Tax').size() # 补全所有Tax,缺失项填充0 tax_counts = tax_counts.reindex(all_taxes, fill_value=0) # 整理为目标多级索引格式 tax_counts = tax_counts.reset_index().assign(**{g_column_name: 1}).set_index([g_column_name, 'Tax'])[0] return tax_counts # 批量处理每个G列 g1_result = get_g_column_counts(self.instance.df, 'G1') g2_result = get_g_column_counts(self.instance.df, 'G2') g3_result = get_g_column_counts(self.instance.df, 'G3') g4_result = get_g_column_counts(self.instance.df, 'G4')
为什么原来的方法不行?
你原来用groupby([Gx, Tax]).size().drop(0)的逻辑,只会保留Gx=1且有对应行的分组。如果某个Tax在Gx里全是0,那这个Tax对应的Gx=1的分组根本就不会被创建,自然不会出现在结果里。而我们的方法是先以所有Tax为基准,强制把每个Tax都纳入结果,再填充0,从根源上解决了维度不一致的问题。
用你的测试数据验证
拿你给出的初始DataFrame测试:
G1 G2 G3 G4 Tax 0 0 1 0 0 1.1 1 1 1 0 1 1.1 2 1 1 0 0 1.2 3 0 1 0 1 1.3
所有Tax的唯一值是[1.1, 1.2, 1.3],处理G1后得到的结果是:
G1 Tax 1 1.1 1 1.2 1 1.3 0
完全符合你想要的包含所有Tax、缺失补0的效果。
备注:内容来源于stack exchange,提问作者Denis Padua
相关产品推荐
相关产品推荐

