如何在Pandas中按年龄计算对应婚姻状况的中位数
解决按年龄求婚姻状况中位数的问题
嘿,我来帮你搞定这个报错和需求!你遇到的DataError: No numeric types to aggregate,本质原因很简单:你用了mean()来计算婚姻状况的统计值,但Estado_Civil是字符串类型的分类数据,根本没有数值可以用来计算均值,自然会报错啦。
要实现每个年龄对应的婚姻状况中位数,我们需要先给婚姻状况赋予有序的逻辑顺序,让pandas能识别它们的优先级,进而计算中位数。具体步骤如下:
步骤1:定义婚姻状况的有序分类
首先得给不同的婚姻状况设定一个合理的顺序(比如「单身(Soltero)」<「已婚(Casado)」<「离婚(Divorciado)」,你可以根据实际需求调整顺序),把字符串列转成有序分类类型。
步骤2:按年龄分组计算中位数
用分组后的median()方法就能正确计算分类数据的中位数,最后再整理成你想要的列名格式。
完整代码示例
import pandas as pd # 假设你的DataFrame是df_edad_estado_civil,先定义婚姻状况的顺序 estado_civil_order = ['Soltero', 'Casado', 'Divorciado'] # 可根据实际类别补充调整 # 将婚姻状况列转为有序分类类型 df_edad_estado_civil['Estado_Civil'] = pd.Categorical( df_edad_estado_civil['Estado_Civil'], categories=estado_civil_order, ordered=True ) # 按年龄分组,计算婚姻状况的中位数,并重命名列 result_df = df_edad_estado_civil.groupby('Edad')['Estado_Civil'].median().reset_index() result_df.columns = ['years_old', 'status_median'] # 可选:把分类类型转回字符串(不转也能显示标签,转了更直观) result_df['status_median'] = result_df['status_median'].astype(str) # 查看结果 print(result_df)
代码说明
- 有序分类会给每个婚姻状况分配一个内在的数值(比如Soltero=0,Casado=1),
median()会基于这个数值计算中间值,再映射回对应的标签。 - 如果你的数据里还有其他婚姻状况,只要在
estado_civil_order里补充进去,调整好顺序就行。
内容的提问来源于stack exchange,提问作者ADRIAN LEON
相关产品推荐
相关产品推荐

