Spark能否实现先按col1、col2分组,再统计col3、col4的分组计数?
当然可以实现!用Pandas就能轻松搞定这个需求,下面是具体的实现步骤和代码示例:
具体实现方案
1. 准备工作
首先导入Pandas库,然后构造你提供的示例数据:
import pandas as pd # 构造输入示例数据 df = pd.DataFrame({ 'col1': [1, 1, 1], 'col2': [1, 1, 1], 'col3': [2, 2, 3], 'col4': [4, 4, 5] })
2. 重塑数据格式
我们需要把原DataFrame的宽表结构转成窄表结构,用melt方法就能实现,这样可以把col3、col4合并成“列名”和“列值”两列,方便后续统一统计:
# 转成窄表:保留col1、col2作为标识列,col3、col4作为待统计的列 melted_df = df.melt(id_vars=['col1', 'col2'], var_name='col_name', value_name='col_value')
这一步之后,melted_df的结构是这样的:
col1 col2 col_name col_value 0 1 1 col3 2 1 1 1 col3 2 2 1 1 col3 3 3 1 1 col4 4 4 1 1 col4 4 5 1 1 col4 5
3. 分组统计计数
接下来按col1、col2、col_name、col_value分组,然后统计每组的数量:
# 分组并计数,最后重置索引 result = melted_df.groupby(['col1', 'col2', 'col_name', 'col_value']).size().reset_index(name='cnt')
4. 查看最终结果
打印result就能得到你想要的输出格式:
print(result)
输出结果和你提供的示例完全一致:
col1 col2 col_name col_value cnt 0 1 1 col3 2 2 1 1 1 col3 3 1 2 1 1 col4 4 2 3 1 1 col4 5 1
关键逻辑说明
melt方法是核心:它把多列(col3、col4)转换成“列名-列值”的成对形式,让原本分散的统计项变成统一的结构,避免重复写两次统计逻辑。groupby+size():按指定的键分组后,size()会返回每组的行数,也就是你需要的计数。
内容的提问来源于stack exchange,提问作者techie
相关产品推荐
相关产品推荐

