Python - Pandas删除包含字符串的行

3

在我的数据集中,有几行包含字符。我只需要包含所有整数的行。最好的方法是什么?以下是数据集: 例如,我想删除第2行和第3行,因为它们分别包含051A、04A和08B。

1   2017    0   321     3   20  42  18
2   051A    0   321     3   5   69  04A
3   460     0   1633    16  38  17  08B
4   1811    0   822     8   13  65  18

你需要检查整数和浮点数[以及其他非字符串类型]吗? - jpp
不,我只是在寻找整数。谢谢! - skoundin
5个回答

8
不确定此处是否可以避免使用“应用(apply)”这个词。
df.apply(lambda x: pd.to_numeric(x, errors = 'coerce')).dropna()

    0   1   2   3   4   5   6   7
0   1   2017.0  0   321 3   20  42  18.0
3   4   1811.0  0   822 8   13  65  18.0

2
有一个选项可以避免使用 apply,尽管我不如 pd.to_numeric(df.stack(), 'coerce').unstack().dropna() 好用。(-: 话虽如此,这并没有解决浮点数的问题。原帖中说所有行都是整数。如果一行中出现了浮点数,这个方法就无法将其删除。 - piRSquared

6
这与@jpp的解决方案非常相似,但在检查数字的技术上有所不同。
df[df.applymap(lambda x: str(x).isdecimal()).all(1)].astype(int)

   0     1  2    3  4   5   6   7
0  1  2017  0  321  3  20  42  18
3  4  1811  0  822  8  13  65  18

感谢 @jpp 建议使用 isdecimal 而不是 isdigit

由于您提到了isdecimal,这给了我一个想法......不确定它的速度会有多快。 - cs95

5

针对此任务,如所述,try / except是一种处理所有情况的解决方案。

pd.DataFrame.applymap将函数应用于数据框中的每个元素。

def CheckInt(s):
    try: 
        int(s)
        return True
    except ValueError:
        return False

res = df[df.applymap(CheckInt).all(axis=1)].astype(int)

#    0     1  2    3  4   5   6   7
# 0  1  2017  0  321  3  20  42  18
# 3  4  1811  0  822  8  13  65  18

1
我非常喜欢这个答案!df[df.applymap(lambda x: str(x).isdigit()).all(1)].astype(int) - piRSquared
1
'1.1'.isdigit() 对我来说解析为 False。另外,当我说我喜欢“这个”答案时,我的意思是你的 (-: - piRSquared
1
添加了一个答案。 - piRSquared

4
作为其他好答案的替代方案,这个解决方案使用 stack + unstack 范式来避免循环的解决方案。
v = df.stack().astype(str)
v.where(v.str.isdecimal()).unstack().dropna().astype(int)

   0     1  2    3  4   5   6   7
0  1  2017  0  321  3  20  42  18
3  4  1811  0  822  8  13  65  18

1
这绝对很有趣,但是isdecimal的问题在于它不能处理浮点数。+1 :) - Vaishali

2

简单来说,我认为您可以使用pandas中的convert_objects函数。使用该函数,我们将对象转换为整数,这将导致NA值。最后,我们删除NA值。

df = df.convert_objects(convert_numeric=True).dropna()

你可以在这里查看更多关于pandas文档的信息:pandas.DataFrame.convert_objects

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接