如何基于两个分类变量创建Pivot Table透视表,无需指定values参数?
问题:如何在不指定特定values列的情况下生成透视表统计计数
原始数据
| 索引 | Job | Y | Balance |
|---|---|---|---|
| 1 | A | Yes | 1 |
| 2 | B | No | 2 |
| 3 | A | No | 5 |
| 4 | A | No | 0 |
| 5 | B | Yes | 4 |
目标结果
| Yes | No | |
|---|---|---|
| A | 1 | 2 |
| B | 1 | 1 |
尝试的代码
pivot = df.pivot_table(index=['job'], columns=['y'], values=['balance'], aggfunc='count')
几种可行的解决方案:
1. 用pd.crosstab(最适合这个场景)
这是pandas专门用来做交叉计数统计的工具,不需要指定values列,直接传入行和列的分组字段即可:
import pandas as pd pd.crosstab(df['Job'], df['Y'])
运行后直接生成你要的交叉计数表,自动按Job和Y的组合统计行数。
2. 用pivot_table替换values列
如果一定要用pivot_table,可以选一个无缺失值的列作为values参数(比如原始数据的「索引」列,甚至Job列本身),因为count统计的是非缺失值数量,只要所选列没有空值,结果就准确:
# 用索引列作为values df.pivot_table(index='Job', columns='Y', values='索引', aggfunc='count') # 或者直接用Job列 df.pivot_table(index='Job', columns='Y', values='Job', aggfunc='count')
3. 分组后转置
先通过groupby统计每个Job-Y组合的行数,再用unstack把Y的取值转成列:
df.groupby(['Job', 'Y']).size().unstack(fill_value=0)
size()会直接返回分组后的行数,unstack负责把层级索引展开成列,fill_value=0可以避免出现空值(如果某个组合没有数据的话)。
内容的提问来源于stack exchange,提问作者Piyush Kaushal
相关产品推荐
相关产品推荐

