You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何基于含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

如果想从分组统计的角度实现,也可以先按xy分组计数,再将结果展开为表格:

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

火山引擎 最新活动