Python Pandas:分组并将列值转为表头的实现方法
问题:将组织分组的布尔值统计转换为宽表格式
你现在有一个包含组织和布尔值的DataFrame,示例数据如下:
Organisation Value A True A True A False A False A True A False B True B True C False C False
想要转换为每个组织一行,以True和False作为表头并统计对应数量的格式:
Organisation True False A 3 3 B 2 0 C 0 2
你当前使用的代码sqlDf.groupby(['Organisation','Value']).size().reset_index(name='counts')只能得到长表格式,无法直接生成目标的宽表,下面是几种可行的解决方法:
方法1:使用Pandas的pivot方法
先分组统计数量,再通过pivot重塑表格结构:
# 先分组统计每个组织对应布尔值的数量 count_df = sqlDf.groupby(['Organisation', 'Value']).size().reset_index(name='counts') # 重塑为宽表,用fillna(0)补全缺失的0值(比如B没有False的情况) result_df = count_df.pivot(index='Organisation', columns='Value', values='counts').fillna(0).reset_index() # 清除列名的层级标记,让表头更整洁 result_df.columns.name = None
方法2:使用Pandas的crosstab一步到位
pd.crosstab可以直接生成交叉统计的宽表,代码更简洁:
import pandas as pd # 直接生成组织和布尔值的交叉统计表 result_df = pd.crosstab(index=sqlDf['Organisation'], columns=sqlDf['Value']).reset_index() # 清除列名层级标记 result_df.columns.name = None
这个方法会自动统计每个组织对应布尔值的出现次数,默认会把缺失的数值填充为0,完全符合你的需求。
方法3:如果是PySpark DataFrame(假设你的sqlDf是Spark数据集)
如果你的sqlDf是PySpark的DataFrame,可以用pivot配合聚合函数实现:
from pyspark.sql import functions as F result_df = sqlDf.groupBy('Organisation') \ .pivot('Value') \ .count() \ .fillna(0)
这里pivot会把Value的唯一值作为新列,count()统计对应数量,fillna(0)负责补全那些没有对应布尔值的组织的0值。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

