根据特定对象值过滤行并删除这些实例

数据挖掘 Python 数据挖掘 熊猫
2021-10-14 00:18:48

我有一些分类数据也包含“?” 作为某些行中的数据。我需要根据“?”过滤这些行,包含该实例的行将被删除。

在此处输入图像描述 在此处输入图像描述

我试图通过应用这些命令来删除这些行,但我失败了。

train = train.drop[~train.str.contains('\?')]
train = train.drop[train['?']]

我如何识别那些包含“?”的行 实例并删除那些行?

2个回答

您可以替换?nan并使用dropna(). 如果您还没有包含nan要保留的条目的行,这将起作用。

train = train.replace('?', np.nan).dropna()

另一种选择是过滤任何值为 的行?

train = train[~(train == '?').any(axis=1)]

更新:

查看您的数据后,我发现了问题:您的 csv 文件在逗号后有空格,因此包含的行?有一个前导空格。

如果您使用train = pd.read_csv('adult.data', sep=', ', engine='python')读取数据,则上述任何一种方法都可以使用。

伊姆兰给出的答案是正确且更笼统的。它将允许您删除任何包含“?”的行 在任何列中。

在这里发布只是为了解释为什么您的两次代码尝试不起作用。通常,对于子设置行,您需要为每一行提供布尔标签,指示是否包含它。因此,您应该编写表达式,使其返回那些布尔掩码。您的尝试几乎是正确的,但是您在整个数据帧上运行了 .str.contains。相反,您应该在各个列上运行它。对于多个列的条件,请组合。我在下面的代码中演示。

# create sample data containing missing values    
tmp =  pd.DataFrame({'a' : ['Craft-repair', 'Sales', '?'], 'b' : [40, '?', 60]})
print ~(tmp['a'].str.contains('\?')) # how boolean mask is generated
tmp = tmp[~(tmp['a'].str.contains('\?'))] # filter on single column
print tmp[~ ((tmp['a'].str.contains('\?')) | (tmp['b'].str.contains('\?')))]

如果'?在读取数据时出现在数据中,您也可以在读取时将其替换为 np.nan ,以便以后使用 dropna 删除这些行。