python - 通过删除行来消除 DataFrame 中一列的倾斜?

标签 python pandas

我有一个 DataFrame,我正在尝试从中构建多元线性回归模型。我遇到的问题是,我的 Y 变量之一在数据集中严重倾斜,因此一侧的权重过大。我需要一种方法来标准化该列,而我能想到的唯一方法是选择和删除行,直到获得均匀分布的数据集。我构建了一个简单的示例来说明下面要讨论的内容。我希望列 [0] 通过消除低尾部而最终呈正态分布。这样做的最佳方法是什么?

import pandas as pd
from matplotlib import pyplot as plt
from numpy.random import seed
from numpy.random import randn
from numpy.random import rand
from numpy import append
seed(1)
data=5*randn(100) + 10
tail = 10 + (rand(50) * 100)
data=append(data, tail)
data2=5*randn(150)+ 10
s1 = pd.Series(data)
s2 = pd.Series(data2)

df = pd.concat([s1, s2], axis=1)

最佳答案

首先,您需要找出一个阈值来区分哪些值属于尾部(太高),哪些不属于尾部。

一种非常凭经验的方法是通过目视检查:绘制数据的直方图,并查看尾部从哪里开始。

plt.hist(df[0])
plt.show()

使用您提供的示例数据,您可以看到尾部从 20 开始,因此您可以将每个大于 20 的值视为分布的尾部。

当然,这是一个非常粗暴的方法。根据您的实际数据,您可能有更好的方法来定义阈值,也许基于数据背后的理论模型。我的意思是,我想您应该知道或至少知道为什么您的发行版中存在尾部。

无论如何,无论您使用什么标准来定义阈值值(这实际上取决于您),一旦您拥有它,您只需将其设置为NaN即可大于阈值的值:

df[0].loc[df[0] > threshold] = np.nan

免责声明:

这种方法可能被认为不合适或错误,因为您正在篡改数据。我不知道你的最终目标是什么,但要小心。

关于python - 通过删除行来消除 DataFrame 中一列的倾斜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57945205/

相关文章:

python-3.x - 在 python panda 上添加元组索引

python - 我怎么知道 Pandas 数据框单元格的类型

python - 使用Python将文本文件打印到特定打印机

python - 不覆盖比较运算符的 Python 对象是否等于自身?

python - 如何在 Python 中连接文本文件?

python - 按列迭代 csv

python - Pandas :合并数据框而不创建新列

python - 如何正则表达式直到最后一次出现?

python - 有没有办法自动激活 virtualenv 作为 docker 入口点?

python - 根据 pandas 中的其他列内容对列进行操作