You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对剔除[-1.0,1.0]值的Z-scores型pandas DataFrame进行离散化?

处理Z-score DataFrame的离散化方案

嘿,我来帮你搞定这个Z-score离散化的事儿!首先先明确你的数据情况:你已经有一个剔除了[-1.0,1.0]区间值的pandas DataFrame,剩下的都是绝对值大于1的正负float64类型数据,示例数据如下:

REF ?|100133144 ?|100134869 ?|10357 ?|10431
A41B-07 0.000 0.0 0.0 1.010
A41B-07 1.497 0.0 0.0 -1.139
A41B-07 0.000 0.0 0.0 1.492
A41B-07 2.300 0.0 0.0 1.310
A41B-07 0.000 0.0 0.0 -1.262
A41B-07 0.000 0.0 0.0 1.283
A41B-07 -1.396 0.0 0.0 1.409
A41B-07 -1.243 0.0 0.0 -1.509
A144-07 0.000 0.0 0.0 1.200
A115-07 0.000 0.0 0.0 1.359

针对这类数据,我给你两种常用的离散化方法,你可以根据需求选:

方法一:用pandas内置的pd.cut快速分组

这是最简洁的方式,适合按固定区间分组的场景。我们可以把Z-score分成极显著负、显著负、显著正、极显著正几个区间(因为你的数据已经去掉了[-1,1],中间的无差异区间可以忽略):

import pandas as pd
import numpy as np

# 先模拟加载你的数据(如果已经有DataFrame可以跳过这部分)
data = [
    ["A41B-07", 0.000, 0.0, 0.0, 1.010],
    ["A41B-07", 1.497, 0.0, 0.0, -1.139],
    ["A41B-07", 0.000, 0.0, 0.0, 1.492],
    ["A41B-07", 2.300, 0.0, 0.0, 1.310],
    ["A41B-07", 0.000, 0.0, 0.0, -1.262],
    ["A41B-07", 0.000, 0.0, 0.0, 1.283],
    ["A41B-07", -1.396, 0.0, 0.0, 1.409],
    ["A41B-07", -1.243, 0.0, 0.0, -1.509],
    ["A144-07", 0.000, 0.0, 0.0, 1.200],
    ["A115-07", 0.000, 0.0, 0.0, 1.359]
]
columns = ["REF", "100133144", "100134869", "10357", "10431"]
z_score_df = pd.DataFrame(data, columns=columns)

# 定义离散化区间和对应标签
bins = [-np.inf, -2, -1, 1, 2, np.inf]
# 可以选数字标签(方便后续统计)或文字标签(更直观)
num_labels = [-2, -1, 0, 1, 2]  # 0对应[-1,1],你的数据里不会出现
text_labels = ["极显著负", "显著负", "无差异", "显著正", "极显著正"]

# 对所有数值列应用离散化
discrete_df = z_score_df.copy()
for col in discrete_df.columns[1:]:  # 跳过REF列
    discrete_df[col] = pd.cut(discrete_df[col], bins=bins, labels=num_labels, include_lowest=True)

# 查看结果
print(discrete_df)

如果想更简洁,也可以用apply批量处理:

discrete_df = z_score_df.set_index("REF").apply(pd.cut, bins=bins, labels=num_labels, include_lowest=True).reset_index()

方法二:自定义函数灵活分组

如果你的区间规则比较特殊(比如想分更多层级),自定义函数会更灵活:

def discretize_z(z):
    # 按需求定义区间逻辑
    if z < -3:
        return -3
    elif -3 <= z < -2:
        return -2
    elif -2 <= z < -1:
        return -1
    elif 1 < z <= 2:
        return 1
    elif 2 < z <= 3:
        return 2
    elif z > 3:
        return 3
    else:
        return 0  # 你的数据里不会触发这个分支

discrete_df = z_score_df.copy()
for col in discrete_df.columns[1:]:
    discrete_df[col] = discrete_df[col].apply(discretize_z)

你可以完全根据业务需求修改discretize_z里的条件,比如调整区间阈值、增加更多分组等。

最后提醒一下:如果后续要做统计分析,用数字标签会更方便;如果是给非技术人员看,文字标签会更直观,按需选择就行~

内容的提问来源于stack exchange,提问作者user3290553

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:41:51