You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas分组后计算列方向分位数时axis参数报错求助

解决GroupBy对象调用quantile时的axis参数报错问题

问题原因

pandas的GroupBy对象的quantile()方法不支持axis参数——该方法默认仅针对分组后的列维度计算分位数,而你需要的是对每组的行维度(横向)计算分位数,因此直接传入axis=1会触发参数错误。

解决方案

针对按site和month分组后计算行分位数的需求,可通过以下两种方法实现:

方法1:使用apply对分组子DataFrame执行行分位数计算

这是最直观的方法,对每个分组的子DataFrame单独调用支持axis参数的quantile():

import pandas as pd

# 修正示例数据的重复列名(实际场景中需确保列名唯一)
df = pd.DataFrame([
    ['A',8,5,6,4,5],['A',9,4,1,2,2],['A',10,3,9,7,7],
    ['A',11,7,2,8,7],['A',12,5,5,4,5],['B',8,3,7,5,5],
    ['B',9,6,9,0,6],['B',10,4,1,3,3],['B',11,8,3,0,3],
    ['B',12,5,6,8,6]
], columns=['site','month','Num1','Num2','Num3','Quantile 0.5'])

# 指定要计算分位数的数值列
num_cols = ['Num1','Num2','Num3']

# 分组后对每组的行计算中位数(quantile=0.5)
df['Calculated_Quantile'] = df.groupby(['site','month'])[num_cols].apply(
    lambda g: g.quantile(q=0.5, axis=1)
).reset_index(drop=True)

方法2:更高效的向量化实现(适合大型DataFrame)

如果你的DataFrame数据量极大,apply可能效率偏低,可通过melt转换格式后分组计算:

import pandas as pd

# 修正列名同方法1
df = pd.DataFrame([...], columns=['site','month','Num1','Num2','Num3','Quantile 0.5'])
num_cols = ['Num1','Num2','Num3']

# 转换为长格式,保留原行索引用于匹配结果
melted = df.melt(
    id_vars=['site','month'],
    value_vars=num_cols,
    value_name='value'
).reset_index()

# 按site、month和原行索引分组,计算中位数
median_series = melted.groupby(['site','month','index'])['value'].quantile(0.5)

# 将结果合并回原DataFrame
df['Calculated_Quantile'] = median_series.reset_index(level=[0,1], drop=True)

验证结果

两种方法计算出的Calculated_Quantile列都会和你示例中的Quantile 0.5列完全一致,满足按月份分组计算行分位数的需求。

内容的提问来源于stack exchange,提问作者user2100039

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 06:54:37