首页 > 解决方案 > 如何在数据框的每一列上计算修改后的 Z 分数和 IQR

问题描述

我有一个数据框,我正在尝试在分析之前清理数据。

由于我的数据有点复杂,因此我正在试用样本数据。

A   B	 C	D
30	24	13	41
30	25	14	45
30	27	15	44
30	28	16	43
31	21	12	4
31	2 	17	99
3	89	99	45
78	24	0   43
35	252	12	45
36	23	13	44

我正在尝试处理异常值并尝试计算修改后的 Z 分数(中位数)和 IQR 以从数据中过滤掉异常值,以便我可以获得质量数据以进行进一步分析。

我想计算 IQR,然后计算每列的 Z 分数,并过滤掉数据框中每一列的异常值。

到目前为止,我已经尝试了几件事,例如:

二维码:


for col in df2.columns:
    col = np.array([col])
    q1_a = np.percentile(col, 25)
    q3_a = np.percentile(col, 75)
    iqr1 = q3_a - q1_a
    print(iqr1)

修改后的 Z 分数:


for col in df2.columns:
    threshold = 3.5
    col_zscore = col +'_zscore'
    median_y = df[col].median()
    print(median_y)
    median_absolute_deviation_y = (np.abs(df2[col] - median_y)).median()
    print(median_absolute_deviation_y)
    modified_z_scores = 0.7413 *((df2[col] - median_y)/median_absolute_deviation_y)
    print(modified_z_scores)
    df2[col_zscore] = np.abs(modified_z_scores)

df2 = df2[(np.abs(df2[col_zscore]) < 3.5).all(axis=1)]
print(df2)

但没有得到正确的答案。该函数不适用于每一列,并在最后创建我意图的数据框。请帮忙。谢谢。

标签: pythonpython-3.xdataframeoutliersiqr

解决方案


对于 IQR 问题:

  Weight    Age
0   40      20
1   62      21
2   35      19
3   29      18

如果您的数据框是这样的,您可以使用以下代码计算 IQR。

for col in df2.columns:
    col_values = df2[col]
    col_values = np.array([col_values])
    q1_a = np.percentile(col_values, 25)
    q3_a = np.percentile(col_values, 75)
    iqr1 = q3_a - q1_a
    print(iqr1)

如果所有数据列都包含数字数据,则可以使用上述代码计算 IQR,否则您需要先将分类数据列编码为数字。如果您期望特定的 IQR 值,请查看numpy 百分位 插值参数。

对于 Z_score 问题:

df3 = df2
for col in df2.columns:
    threshold = 3.5
    col_zscore = col +'_zscore'
    median_y = df2[col].median()
    print(median_y)
    median_absolute_deviation_y = (np.abs(df2[col]-median_y)).median()
    print(median_absolute_deviation_y)
    modified_z_scores = 0.7413 *((df2[col] - median_y)/median_absolute_deviation_y)
    print(modified_z_scores)
    df2[col_zscore] = np.abs(modified_z_scores)

df2 = df3[(np.abs(df3[col_zscore]) < 3.5)]
print(df2)

试试上面的代码。


推荐阅读