如何基于含0、1随机值的双列DataFrame创建交叉计数透视表
如何生成0/1两列的交叉计数表格?
我创建了一个包含两列的DataFrame,列值为随机生成的0或1,代码如下:
import numpy as np import pandas as pd x = np.random.randint(2, size=1000).reshape(500,2) data = pd.DataFrame(x ,columns=['x','y']) data
我希望生成一个如下格式的表格(或另一个DataFrame):
0 1 0 count count 1 count count
我认为需要使用透视表(pivot table)来实现,但尝试后未能成功,请问该如何操作?
你可以用几种简单的方法实现这个需求,下面给你详细说明:
方法1:使用pd.crosstab(最直接的方式)
这是Pandas专门为生成交叉频数表设计的函数,完全贴合你的需求,一行代码就能搞定:
cross_table = pd.crosstab(data['x'], data['y']) print(cross_table)
执行后会直接输出以x的0/1值为行、y的0/1值为列的表格,单元格就是对应组合的出现次数。
方法2:正确使用透视表pivot_table
你之前尝试透视表没成功大概率是参数设置不对,只需指定行、列和统计方式即可:
# 用size统计分组行数,等价于计数 pivot_table = data.pivot_table(index='x', columns='y', aggfunc='size') # 也可以用aggfunc=len,效果一致 # pivot_table = data.pivot_table(index='x', columns='y', aggfunc=len) print(pivot_table)
这里的size会自动统计每个(x,y)组合的行数,正好是我们需要的计数结果。
方法3:使用groupby + unstack
如果想从分组统计的角度实现,也可以先按x和y分组计数,再将结果展开为表格:
grouped_table = data.groupby(['x', 'y']).size().unstack(fill_value=0) print(grouped_table)
unstack会把y的取值转换为列,fill_value=0可以保证即使某个(x,y)组合没有数据,也会显示0而不是NaN。
这几种方法都能生成你想要的格式,其中pd.crosstab最简洁直观,推荐优先使用~
内容的提问来源于stack exchange,提问作者Innuendo




