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

