我有一个 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/