根据特定对象值过滤行并删除这些实例
数据挖掘
Python
数据挖掘
熊猫
2021-10-14 00:18:48
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 删除这些行。
其它你可能感兴趣的问题

