与Pandas cut一起使用时的Pandas Crosstab:输出交叉表的行名不匹配

时间:2018-07-17 09:36:10

标签: python dataset pandas visualization

我有一些带有二进制(0和1)标签的数据。在新字段上进行pd.cut之前,我正在使用continuous_value离散化一项功能pd.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的总数为118,零bin的总数为10237。反之亦然。

output


编辑以包括伪造的数据和再现错误的代码段:

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)

Dummy code and error in output

1 个答案:

答案 0 :(得分:0)

这似乎是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