PySpark:将列级统计结果按列聚合而非行聚合的实现
按列组织DataFrame统计信息并扩展指标
示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ 'col1': [1, 2, np.nan, 4], 'col2': [5, 6, 7, 8], 'col3': [np.nan, np.nan, 10, 11] })
方案1:直接生成按列组织的统计结果(高效无重塑)
无需使用melt/pivot,直接通过列聚合+转置生成按列维度排列的统计表,同时可轻松添加衍生指标:
# 定义需要的统计指标 stats = { 'nan_count': lambda x: x.isna().sum(), 'non_null_count': 'count' # 内置统计函数直接调用 } # 生成基础统计结果,转置后将原DataFrame的列转为统计表的行 stats_df = df.agg(stats).T # 新增衍生指标:判断列是否无空值 stats_df['has_no_nulls'] = stats_df['nan_count'] == 0 print(stats_df)
输出结果:
nan_count non_null_count has_no_nulls col1 1 3 False col2 0 4 True col3 2 2 False
方案2:在原DataFrame中新增统计行
如果需要保留原始数据并在底部追加统计行,可通过pd.concat实现:
# 生成空值数量统计行 nan_count_row = pd.Series( data=[df[col].isna().sum() for col in df.columns], index=df.columns, name='nan_count' ) # 生成无空值标识统计行 has_no_null_row = pd.Series( data=[df[col].isna().sum() == 0 for col in df.columns], index=df.columns, name='has_no_nulls' ) # 将统计行合并到原DataFrame df_with_summary = pd.concat([df, nan_count_row.to_frame().T, has_no_null_row.to_frame().T]) print(df_with_summary)
输出结果:
col1 col2 col3 0 1.0 5.0 NaN 1 2.0 6.0 NaN 2 NaN 7.0 10.0 3 4.0 8.0 11.0 nan_count 1.0 0.0 2.0 has_no_nulls False True False
方案优势
两种方案都避免了melt/pivot的数据重塑操作,在列数较多的场景下性能更优;同时统计结构清晰,便于后续扩展更多指标(如唯一值数量、均值等)。
内容的提问来源于stack exchange,提问作者Courier
相关产品推荐
相关产品推荐

