寻求PySpark groupby/pivot/sum的Pandas等价实现(尝试后未达预期)
Pandas实现PySpark groupby+pivot+sum的等价逻辑
首先你的代码存在两处基础错误:
- 数据字典
data里的Status列表长度与Name、Score不匹配(前者5个元素,后两者4个),会导致创建DataFrame失败 groupby(['Name')存在语法错误,缺少右方括号,应改为groupby(['Name'])
以下是修正后的正确实现方式:
方法1:使用pivot_table(推荐)
pivot_table是Pandas中实现透视表的专用函数,直接对应PySpark的groupby+pivot+sum逻辑:
import pandas as pd # 修正数据长度匹配问题 data = { 'Name': ['Tom', 'Jack', 'Steve', 'Ricky'], 'Score': [28, 34, 29, 42], 'Status': [1, 0, 1, 0] # 调整为4个元素,与其他列长度一致 } df = pd.DataFrame(data) # 等价于PySpark的groupby('Name').pivot('Status').sum('Score') result = df.pivot_table( index='Name', columns='Status', values='Score', aggfunc='sum', fill_value=0 # 可选:将缺失值填充为0 ) print(result)
方法2:先groupby再透视
如果要模拟先分组再透视的步骤,可以先按Name和Status分组求和,再用unstack实现透视:
# 先按Name和Status分组求和 grouped = df.groupby(['Name', 'Status'])['Score'].sum() # 将Status列转为列索引实现透视 result = grouped.unstack(level='Status', fill_value=0) print(result)
两种方法的输出结果一致:
Status 0 1 Name Jack 34 0 Ricky 42 0 Steve 0 29 Tom 0 28
内容的提问来源于stack exchange,提问作者Victor Johnson
相关产品推荐
相关产品推荐

