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

Pandas DataFrame计算四分位数报错,求助Lambda函数解决方案

问题描述

我想用Pandas DataFrame基于同一份数据计算四分位数等统计量并存储,写了下面的函数但运行报错:

def fences(data):
    """
    Returns with the fences defined based on statistical quartiles
    
    data: Raw data
    
    return: DataFrame with X,Y,Z in columns ans Q1,Q2,Q3,IQR,F_l,F_h
    """
    
    dp = pd.DataFrame(index=["Q1","Q2","Q3","IQR","F_l","F_h"], columns=["X","Y","Z"])
    
    """Calculate quartiles"""
    dp.iloc[0:1,0:3] = record.iloc[:,1:4].quantile(.25)
    dp.iloc[1:2,0:3] = record.iloc[:,1:4].quantile(.5)
    dp.iloc[2:3,0:3] = record.iloc[:,1:4].quantile(.75)
    
    """Calculate IQRs"""
    dp.iloc[3:4,0:3] = dp.iloc[2:3,0:3] - dp.iloc[0:1,0:3]
    
    return dp

错误信息:
ValueError: could not broadcast input array from shape (2,3) into shape (1,3)

排查后发现Q1和Q3相减得到的是(2,3)形状而非预期的(1,3),怀疑是行索引导致的问题,希望用Lambda函数解决。

解决方案

原因分析

你用iloc[2:3]和iloc[0:1]提取的是带行索引的DataFrame,相减时Pandas会按行索引对齐——因为两个子DataFrame的行索引分别是Q3和Q1,结果会保留这两行,所以得到形状为(2,3)的DataFrame,无法赋值到dp.iloc[3:4,0:3]这个(1,3)的位置。

解决方法1:避免索引对齐问题

直接提取四分位数的数值(而非带索引的DataFrame),再赋值到目标位置:

def fences(data):
    """
    Returns with the fences defined based on statistical quartiles
    
    data: Raw data
    
    return: DataFrame with X,Y,Z in columns ans Q1,Q2,Q3,IQR,F_l,F_h
    """
    
    dp = pd.DataFrame(index=["Q1","Q2","Q3","IQR","F_l","F_h"], columns=["X","Y","Z"])
    
    # 计算并存储四分位数
    q1 = data.iloc[:,1:4].quantile(.25)
    q2 = data.iloc[:,1:4].quantile(.5)
    q3 = data.iloc[:,1:4].quantile(.75)
    
    dp.loc["Q1"] = q1
    dp.loc["Q2"] = q2
    dp.loc["Q3"] = q3
    
    # 计算IQR、上下界
    iqr = q3 - q1
    dp.loc["IQR"] = iqr
    dp.loc["F_l"] = q1 - 1.5 * iqr
    dp.loc["F_h"] = q3 + 1.5 * iqr
    
    return dp

解决方法2:用Lambda函数批量计算(满足需求)

结合agg方法,用Lambda函数一次性定义并计算所有统计量,代码更简洁高效:

def fences(data):
    # 定义需要计算的统计量Lambda函数
    stats_calculators = {
        "Q1": lambda col: col.quantile(0.25),
        "Q2": lambda col: col.quantile(0.5),
        "Q3": lambda col: col.quantile(0.75),
        "IQR": lambda col: col.quantile(0.75) - col.quantile(0.25),
        "F_l": lambda col: col.quantile(0.25) - 1.5 * (col.quantile(0.75) - col.quantile(0.25)),
        "F_h": lambda col: col.quantile(0.75) + 1.5 * (col.quantile(0.75) - col.quantile(0.25))
    }
    
    # 对指定列应用统计量计算,转置后匹配目标格式
    result_df = data.iloc[:,1:4].agg(stats_calculators).T
    
    return result_df

这个方法直接通过agg为每个列批量计算所有统计量,转置后自动生成以统计量为行、X/Y/Z为列的DataFrame,彻底避开了索引对齐的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 04:52:53