python - Pandas Crosstab 与 Pandas cut 一起使用时:输出交叉表的行名不匹配
问题描述
我有一些带有二进制(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 名称不匹配。非零 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)
解决方案
这似乎是 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
推荐阅读
- mysql - Rails 登录背后的逻辑是什么?
- iis - 尝试使用非英文字符提供静态文件时出现 404
- sql - Sql server 从二进制数据类型到数值数据的转换问题
- shell - shell 脚本中的命令 curl 格式错误
- node.js - 如何使用 Github API 为 github 存储库加注星标 - 我的请求有什么问题?
- ios - 录制iOS模拟器产生空文件
- jquery - Wordpress POST 请求使用 XMLHttp 和 Axios 失败,但适用于 jQuery。有什么不同?
- c# - 如何同时使用 A.dll 和依赖于不同版本 A.dll 的第 3 方库
- perl - Net::OpenSSH 中的交互模式
- java - Struts 1 表单嵌套属性无法解析