如何合并Pandas交叉表并保留相同二元列?保留分类变量分组
解决方案:保留分组标识的交叉表堆叠
问题分析
你当前用pd.concat([a,b])合并交叉表时,丢失了GenderDSC和Race的分组标识,导致无法区分堆叠后的行属于性别还是种族分类。要解决这个问题,需要给每个交叉表的索引添加层级标签,或者先重构数据集再生成统一的交叉表。
方法一:给交叉表添加多层索引后合并
先分别为两个交叉表的索引添加上层分组标签,再合并:
import pandas as pd df = pd.DataFrame({'GenderDSC':['Male','Female','Female','Male','Male','Male'], 'Goal':[0,1,0,1,0,0], 'Race':['African-American','White','White','Asian','Asian','White']}) # 生成性别交叉表,添加上层索引"GenderDSC" a = pd.crosstab(df['GenderDSC'], df['Goal']) a.index = pd.MultiIndex.from_product([['GenderDSC'], a.index], names=['Category', 'Value']) # 生成种族交叉表,添加上层索引"Race" b = pd.crosstab(df['Race'], df['Goal']) b.index = pd.MultiIndex.from_product([['Race'], b.index], names=['Category', 'Value']) # 合并两个交叉表 result = pd.concat([a, b]) print(result)
输出结果会清晰保留分组标识:
Goal 0 1 Category Value GenderDSC Male 3 1 Female 1 1 Race African-American 1 0 White 2 1 Asian 1 1
方法二:重构数据集后生成统一交叉表
先把性别和种族数据整合成同一格式的长表,再一次性生成带分组标识的交叉表,这种方法更简洁且易于扩展:
import pandas as pd df = pd.DataFrame({'GenderDSC':['Male','Female','Female','Male','Male','Male'], 'Goal':[0,1,0,1,0,0], 'Race':['African-American','White','White','Asian','Asian','White']}) # 重构数据集:分别提取性别和种族数据,添加分类标签 gender_df = df.assign(Category='GenderDSC').rename(columns={'GenderDSC': 'Value'}) race_df = df.assign(Category='Race').rename(columns={'Race': 'Value'}) combined_df = pd.concat([gender_df, race_df]) # 生成带分组标识的交叉表 result = pd.crosstab([combined_df['Category'], combined_df['Value']], combined_df['Goal']) print(result)
此方法与方法一输出结果完全一致,新增其他分类变量时只需重复类似的重构步骤即可。
原方法失效原因
原代码中pd.concat([a,b])仅简单堆叠行,但两个交叉表的索引仅包含各自的分类值(如Male、White),没有绑定所属的分组类型,合并后自然丢失了分组信息。通过添加多层索引或重构数据集,我们为每个行值明确标注了所属分类,从而完整保留分组标识。
内容的提问来源于stack exchange,提问作者Gabe Verzino
相关产品推荐
相关产品推荐

