使用pd.cut进行二值化

2024-05-15 16:37:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我是ML领域的新手。我正在努力学习预处理

我有一个结果数据,有四种类型的输入:0,1,2,3,4

0对应于无疾病,而1到4对应于不同类型的疾病

我希望将它们二元化为两个:0表示“无疾病”,1-4表示“有疾病”

我的代码:

binarize_outcome['Outcome']=pd.cut(outcome_variable['Outcome'], bins=[0,1,4], labels=["no heart disease","heart diseases"])
binarize_outcome

输出:

0                                                        NaN
1                                           no heart disease
2                                           no heart disease
3                                                        NaN
4                                                        NaN
                                 ...                        

299                                         no heart disease
300                                         no heart disease
301                                         no heart disease
302                                                      NaN
Outcome    0                   NaN
1        heart disease...
Name: Outcome, Length: 304, dtype: object

如您所见,这不是我期望的输出,因为我的代码将0标记为NaN,而其余的标记不正确

希望你能帮我弄清楚这部分

提前感谢,, 艺术


Tags: 数据no代码标记类型nanml领域
1条回答
网友
1楼 · 发布于 2024-05-15 16:37:22

您的条件是二进制的,因此可以从numpy使用^{}

>>> import numpy as np
>>> df
    Type
0      2
1      2
2      3
3      0
4      2
..   ...
95     2
96     4
97     0
98     0
99     1

[100 rows x 2 columns]

>>> df["Outcome"] = np.where(df == 0, "no heart disease", "heart disease")
>>> df
    Type           Outcome
0      2     heart disease
1      2     heart disease
2      3     heart disease
3      0  no heart disease
4      2     heart disease
..   ...               ...
95     2     heart disease
96     4     heart disease
97     0  no heart disease
98     0  no heart disease
99     1     heart disease

[100 rows x 2 columns]

或与来自pandas^{}一起:

>>> df["Outcome"] = pd.cut(df["Type"], [0, 0.9999999, 4],
                           labels=["no heart disease", "heart disease"],
                           include_lowest=True)
>>> df
    Type           Outcome
0      2     heart disease
1      2     heart disease
2      3     heart disease
3      0  no heart disease
4      2     heart disease
..   ...               ...
95     2     heart disease
96     4     heart disease
97     0  no heart disease
98     0  no heart disease
99     1     heart disease

[100 rows x 2 columns]

^{}的结果相同:

>>> interval = pd.IntervalIndex.from_breaks([0, 1, 5], closed="left")
>>> df["Outcome"] = pd.cut(df["Type"], interval, include_lowest=True) \
                      .cat.rename_categories(["no heart disease", "heart disease"])

相关问题 更多 >