如何在熊猫列中删除不包含字符串类型的行?

Har*_*han 5 python string dataframe python-2.7 pandas

我有一个包含四列的csv文件。我这样阅读:

df = pd.read_csv('my.csv', error_bad_lines=False, sep='\t', header=None, names=['A', 'B', 'C', 'D'])
Run Code Online (Sandbox Code Playgroud)

现在,字段C包含字符串值。但是在某些行中有非字符串类型(浮点数或数字)值。如何删除那些行?我正在使用Pandas的0.18.1版本。

piR*_*red 5

设定

df = pd.DataFrame([['a', 'b', 'c', 'd'], ['e', 'f', 1.2, 'g']], columns=list('ABCD'))
print df

   A  B    C  D
0  a  b    c  d
1  e  f  1.2  g
Run Code Online (Sandbox Code Playgroud)

注意,您可以看到什么是单个单元格类型。

print type(df.loc[0, 'C']), type(df.loc[1, 'C'])

<type 'str'> <type 'float'>
Run Code Online (Sandbox Code Playgroud)

面膜和切片

print df.loc[df.C.apply(type) != float]

   A  B  C  D
0  a  b  c  d
Run Code Online (Sandbox Code Playgroud)

更一般

print df.loc[df.C.apply(lambda x: not isinstance(x, (float, int)))]

   A  B  C  D
0  a  b  c  d
Run Code Online (Sandbox Code Playgroud)

您也可以float尝试确定它是否可以是浮点数。

def try_float(x):
    try:
        float(x)
        return True
    except:
        return False

print df.loc[~df.C.apply(try_float)]

   A  B  C  D
0  a  b  c  d
Run Code Online (Sandbox Code Playgroud)

这种方法的问题在于,您将排除可解释为浮点数的字符串。

比较我提供的几个选项的时间,以及jezrael使用小型数据帧的解决方案。

在此处输入图片说明

对于具有500,000行的数据框:

在此处输入图片说明

检查其类型是否为float似乎是最高性能的,其后面是数字。如果您需要检查int和float,我会同意jezrael的回答。如果您可以通过检查浮标来解决问题,请使用该浮标。