gpt4 book ai didi

python - 如何删除数据集中的垃圾值或缺失值?

转载 作者:行者123 更新时间:2023-12-01 07:20:28 25 4
gpt4 key购买 nike

我有一个大约 140 万行 x 16 列的数据集,数据集中没有缺失值,但有一些字符串或文本,例如 "+AC0-5.3" 而不仅仅是空或 'NaN'

不同条目'AC0-***'后的数值不同,但均以'+***-***'开头。这该如何处理呢?我想在有此类条目的地方删除所有行将是一个好主意。

我尝试了堆栈溢出的解决方案:

dataset = dataset[~dataset['total+AF8-amount'].astype(str).str.startswith('+')]

这有助于删除具有该缺失值条目的所有行。问题是它只检查目标列中的缺失值,即“total+AF8-amount”。

我想删除任何列中存在奇怪缺失值的所有行,我该如何完成此操作?这是训练集 .head()抱歉,格式错误,每个空格都指下一列,

ID  vendor+AF8-id   pickup+AF8-loc  drop+AF8-loc    driver+AF8-tip  mta+AF8-tax distance    pickup+AF8-time drop+AF8-time   num+AF8-passengers  toll+AF8-amount payment+AF8-method  rate+AF8-code   stored+AF8-flag extra+AF8-charges   improvement+AF8-charge  total+AF8-amount
0 1 170 233 1.83 0.5 0.7 04-04-2017 17.59 04-04-2017 18.05 1 0 1 1 N 1 0.3 9.13
1 2 151 243 3.56 0.5 4.64 04-03-2017 19.03 04-03-2017 19.20 1 0 1 1 N 1 0.3 21.36
2 2 68 90 1.5 0.5 1.29 04-03-2017 15.06 04-03-2017 15.12 2 0 1 1 N 0 0.3 8.8
3 2 142 234 1.5 0.5 2.74 04-04-2017 8.10 04-04-2017 8.27 1 0 1 1 N 0 0.3 14.8
1656 2 114 255 3.96 0.5 3.92 04-05-2017 22.57 04-05-2017 23.22 2 0 1 1 N 0.5 0.3 23.76
1657 2 230 100 0 **+AC0-0.5** 0.51 04-06-2017 8.14 04-06-2017 8.18 1 0 3 1 N 0 **+AC0-0.3 +AC0-5.3**
1658 2 163 226 0 0.5 3.93 04-07-2017 4.06 04-07-2017 4.20 1 0 2 1 N 0.5 0.3 15.8
1659 2 229 90 2.56 0.5 2.61 04-07-2017 13.49 04-07-2017 14.06 2 0 1 1 N 0 0.3 15.36

例如,ID 1657 的行有一个缺失的条目,还有其他这样的行。这就是我所做的:

dataset = pd.read_csv('chh-OLA-Kaggle.csv', index_col = 'ID')
testset = pd.read_csv('test.csv', index_col = 'ID')
dataset.dropna(axis = 0, subset = ['total+AF8-amount'], inplace = True)

dataset = dataset[~dataset['total+AF8-amount'].astype(str).str.startswith('+')]
X = dataset.iloc[:, :15].values
y = dataset['total+AF8-amount'].values

出现的另一个问题是,现在所有这些值都是“str”类型,如何使所有数值列都键入“float64”,以便我可以将其适合模型。

所有数据集都是这样吗?

最佳答案

但是,这个问题已经得到了解答,但我仍然找到了一种不同的方法,我在 3 年前就使用过 So 本身,这更直观,也更好。

str.contains('+') 匹配任何字符串的开头,因为每个字符串都有开头,所以一切都匹配。而是使用 str.contains('\+') 来匹配文字 + 字符。

因此,我们可以通过调用 str.contains 对每一列使用 for col in df 来通过 np.column_stack()< 获取值 作为 bool 掩码并保存它,然后使用 dataFrame.loc() 沿 row-wise(asis=1) 应用它。

示例数据框:

>>> df
col1 col2 col3
0 32.1 33.2 +232
1 34.2 3.4 3.4
2 32.44 +232 32.44
3 +232 1.32 +234
4 1.312 131.23 131.23

解决方案:

>>> mask = np.column_stack([df[col].str.contains(r"\+", na=False) for col in df])

>>> df.loc[ ~ mask.any(axis=1)]
col1 col2 col3
1 34.2 3.4 3.4
4 1.312 131.23 131.23

解决方案2:

没有np.column_stack purly使用pandas,但它返回数据帧obj,而之前使用numpy返回numpy.ndarray,这最适合 bool 掩码。

>>> mask = df.apply(lambda x: x.str.contains(r'\+', na=False))
>>> df.loc[ ~ mask.any(axis=1)]
col1 col2 col3
1 34.2 3.4 3.4
4 1.312 131.23 131.23

如果您需要应用float,请尝试以下操作..

df.loc[ ~ mask.any(axis=1)].astype(float)

注意:

既然你问了,使用 ~ 用作 bool 向量来过滤数据。其他运算符有:| 表示 or,& 表示 and,~ 表示 not。这些必须使用括号进行分组。

关于python - 如何删除数据集中的垃圾值或缺失值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57726055/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com