自定义中位数函数应用于数据集时报错的技术咨询
问题分析与解决
错误原因
你用pandas.Series.apply(func_median)时,apply会把列里的每一个单独的float值传给func_median,而非把整个列的列表传入。你的函数第一行就执行n = len(n_num),单个float类型没有len()方法,因此直接触发TypeError。
另外你的自定义函数只有print输出,没有返回值——就算参数问题解决,赋值后的列也会全是None,这也是需要修正的点。
解决方法
场景1:计算整个列的中位数(最常用)
完全不需要自定义函数,直接用pandas自带的median()方法即可:
# 计算列的中位数 col_median = new_df_housing['median_income'].median() # 若要把该中位数作为新列填充到每一行 new_df_housing['median_income_col'] = col_median
场景2:坚持用自定义函数计算整个列的中位数
直接把列转成列表传给函数,不要用apply:
# 先修改函数,让它返回中位数而非仅打印 def func_median(n_num): n = len(n_num) n_num.sort() if n % 2 == 0: median1 = n_num[n//2] median2 = n_num[n//2 - 1] median = (median1 + median2)/2 else: median = n_num[n//2] return median # 将列转为列表传入函数 col_median = func_median(new_df_housing['median_income'].tolist()) # 赋值为新列 new_df_housing['median_income_col'] = col_median
场景3:对分组后的子组计算中位数(若这是你的真实需求)
如果想按某些列分组后,为每组计算median_income的中位数,可结合groupby与transform实现:
# 示例:按'housing_type'列分组,每组计算中位数并匹配回原行 new_df_housing['group_median'] = new_df_housing.groupby('housing_type')['median_income'].transform(func_median)
内容的提问来源于stack exchange,提问作者Arup Maity
相关产品推荐
相关产品推荐

