如何用df.apply()为频率分布表各列计算中位数并添加新行
实现步骤与代码示例
1. 确认自定义中位数函数的参数适配
假设你已定义的median_函数接收两个Series参数:val(组中值列)和freq(单列频率数据),示例逻辑如下(以你实际实现为准):
def median_(val, freq): total = freq.sum() cumulative_freq = freq.cumsum() median_position = total / 2 # 定位中位数所在分组 target_idx = cumulative_freq[cumulative_freq >= median_position].index[0] # 返回对应组中值(若需插值计算可调整此处逻辑) return val.iloc[target_idx]
2. 定义apply用的列处理函数
编写适配df.apply()的函数,每处理一列频率数据时自动传入组中值列:
def compute_col_median(freq_col): # 替换'Xi'为你实际的组中值列名 return median_(df['Xi'], freq_col)
3. 批量计算频率列的中位数
选择目标频率列(示例为第1到第7列,Python切片左闭右开,故用1:8),调用apply()计算:
# 计算所有目标列的中位数结果 median_results = df.iloc[:, 1:8].apply(compute_col_median)
4. 将结果添加为新行到原DataFrame
推荐用loc直接赋值(适配pandas新版本,替代已弃用的append方法):
# 初始化名为'median'的新行为空值 df.loc['median'] = pd.NA # 填充计算好的中位数到对应频率列 df.loc['median', df.columns[1:8]] = median_results.values # 组中值列无需中位数,保持空值即可
注意事项
- 如果频率列是通过列名而非位置索引确定,直接替换选择列的代码,比如
df[['freq_2010', 'freq_2011', ..., 'freq_2016']].apply(compute_col_median) - 若
median_函数需要额外参数,可使用functools.partial封装后再传入apply - 确保频率列无缺失值,或在
median_中添加空值处理逻辑
内容的提问来源于stack exchange,提问作者arkriger
相关产品推荐
相关产品推荐

