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

Python分组DataFrame统计函数无结果且变量未定义问题求助

问题描述

我写了一个Python函数,输入是分组后的DataFrame(grouped_df),想要输出包含各列统计信息的DataFrame,统计项包括NA数量、NA占比、唯一值数量、基尼系数、众数、中位数等。但运行代码后没有任何结果,而且尝试提取函数内的变量(比如results、group_result、group_df_mode)时,都提示“xxx未定义”,所有内部变量都报这个错,求排查。

原代码如下:

grouped_df = df.groupby(['Store_Region', 'shop_retail'])

def calculate_group_statistics(grouped_df):
    results = []
    
    for (group_Store_Region, group_shop_retail), group_df in grouped_df:
        group_result = {
            'Group_Store_Region': group_Store_Region,
            'shop_Retail': group_shop_retail
        }
    
        group_df_na_sum = group_df.isna().sum()
        group_result.update({'Sum_of_NA': group_df_na_sum})
    
        group_df_na_percentage = (group_df_na_sum / len(group_df)) * 100
        group_result.update({'Percentage_of_NA': group_df_na_percentage})
    
        group_df_n_unique = group_df.nunique()
        group_result.update({'N_Unique': group_df_n_unique})
    
        gini_values = []
    
        for colonna in group_df.columns:
            fr_absolute = group_df.groupby(by=colonna, dropna=False).size()
            array = fr_absolute.values
            fr_relative = array / sum(array)
            indice_gini = 1 - sum(fr_relative * fr_relative)
    
            gini_values.append({'Colonna': colonna, 'Indice Gini': indice_gini})
    
        gini_values_df = pd.DataFrame(gini_values)
        group_result['Gini_Values'] = gini_values_df
    
        group_df_std = group_df.std()
        group_result.update({'Standard_Deviation': group_df_std})
    
        group_df_mean = group_df.mean()
        group_result.update({'Mean': group_df_mean})
    
        group_df_mode = group_df.mode().iloc[0] 
        group_result.update({'Mode': group_df_mode})
    
        group_df_median = group_df.median()
        group_result.update({'Median': group_df_median})
    
        results.append(group_result)
    
    result_df = pd.DataFrame(results)
    return result_df
问题排查与解决

1. 核心问题:函数未调用+局部变量无法外部访问

你只定义了函数,但没有实际调用它并接收返回结果。函数内部的所有变量(比如results、group_result)都是局部变量,仅在函数执行时存在,外部代码无法直接访问,这就是你提取变量时提示“未定义”的根本原因。

2. 次要问题:数据结构冲突

原代码中,你把Series(比如group_df_na_sum、group_df_n_unique)和DataFrame(gini_values_df)直接塞进字典单元格,转成最终DataFrame时会出现结构不兼容的问题,导致结果异常甚至无输出。

修正后的完整代码

import pandas as pd

def calculate_group_statistics(grouped_df):
    results = []
    
    # 遍历每个分组
    for (store_region, shop_retail), group_df in grouped_df:
        # 遍历分组内的每一列,生成列级统计
        for col in group_df.columns:
            # 基础统计项计算
            na_count = group_df[col].isna().sum()
            na_pct = (na_count / len(group_df)) * 100
            n_unique = group_df[col].nunique(dropna=False)
            mean_val = group_df[col].mean()
            median_val = group_df[col].median()
            std_val = group_df[col].std()
            
            # 众数处理:避免无众数时报错
            mode_val = group_df[col].mode().iloc[0] if not group_df[col].mode().empty else pd.NA
            
            # 基尼系数计算(优化效率)
            val_counts = group_df[col].value_counts(dropna=False)
            relative_freq = val_counts / val_counts.sum()
            gini_index = 1 - sum(relative_freq ** 2)
            
            # 整理当前分组+列的统计结果
            row = {
                'Store_Region': store_region,
                'shop_retail': shop_retail,
                'Column': col,
                'N°NA': na_count,
                '%NA': round(na_pct, 2),
                'Nunique': n_unique,
                'Gini Index': round(gini_index, 4),
                'Mode': mode_val,
                'Median': median_val,
                'Mean': round(mean_val, 2),
                'Standard Deviation': round(std_val, 2)
            }
            results.append(row)
    
    # 转换为标准DataFrame返回
    return pd.DataFrame(results)

# 假设df是你的原始数据框,先执行分组
grouped_df = df.groupby(['Store_Region', 'shop_retail'])
# 调用函数并接收结果
final_stats = calculate_group_statistics(grouped_df)
# 打印结果查看
print(final_stats.head())

关键改进点

  • 新增函数调用逻辑,通过返回值获取统计结果,解决局部变量无法访问的问题
  • 调整数据结构:以「分组+列」为每一行的维度,避免单元格嵌套复杂结构的问题
  • 优化基尼系数计算,用value_counts替代二次分组,提升执行效率
  • 增加众数的空值处理,避免无众数场景下的报错
  • 对百分比、均值等数值做四舍五入,结果更整洁易读

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:35:32