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
相关产品推荐
相关产品推荐

