如何对剔除[-1.0,1.0]值的Z-scores型pandas 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

