首页 > 解决方案 > Pandas Crosstab 与 Pandas cut 一起使用时:输出交叉表的行名不匹配

问题描述

我有一些带有二进制(0 和 1)标签的数据。在对新领域进行操作之前,我正在使用pd.cut离散化一个特征。continuous_valuepd.crosstab

问题是当我做交叉表时,输出似乎与相应的计数不匹配行名(这是每个 bin 的边界)。

这是我的问题的最小示例的代码。continuous_value是非负的。118 个数据点有continuous_value = 0,所以最小的 bin 边缘是 -1,包括这些。在这个最小的例子中,数据被分成两个 bin:(-1 到 0),它只包括具有 0 值的那些,和(0 到 5000000),它包括所有其他数据点。

bins=[-1,0,5000000]
input_df['discrete_value']=pd.cut(input_df['continuous_value'],bins=bins)    
pd.crosstab(input_df.discrete_value, input_df.label)

正如您在附图中看到的那样,bin 名称不匹配。非零 bin 的计数总和为 118,零 bin 的计数总和为 10237。这应该是相反的。

输出


编辑以包含虚拟数据和重现错误的代码片段:

values = [5100,5400,9400,10000,16000,10500,0,0,0,87500,14000,11250] d = {'continuous': values,'label': [0]*6+[1]*6} df = pd.DataFrame(data=d) bins = [-1, 0, 5000000] df['discrete'] = pd.cut(df['continuous'], bins=bins)

输出中的伪代码和错误

标签: pythondatasetpandasvisualization

解决方案


这似乎是 Pandas 0.23.0 版的问题。在最新版本 0.23.2 中,它正确分配了标签。

import pandas as pd
values = [5100,5400,9400,10000,16000,10500,0,0,0,87500,14000,11250]
d = {'continuous': values,'label': [0]*6+[1]*6}
df = pd.DataFrame(data=d)
bins = [-1, 0, 5000000]
df['discrete'] = pd.cut(df['continuous'], bins=bins)

print(pd.crosstab(df.discrete, df.label))

给出所需的输出

label         0  1
discrete          
(-1, 0]       0  3
(0, 5000000]  6  3

推荐阅读