Pandas中的布尔逻辑返回“KeyError:True”

时间:2018-02-15 21:31:10

标签: python python-2.7 pandas

我正在尝试使用select语句从日期框架中删除所有行,其中某列中的值不以126.1开头。

我的数据集的一个例子是:

File      Date          Time         RA         Dec
ad0147.fits  18-02-13  22:26:01.779  126.109510  27.360011
ad0147.fits  18-02-13  22:26:01.779  126.061077  27.361124
ad0147.fits  18-02-13  22:26:01.779  125.994430  27.363504

我想过滤掉所有不以126.1开头的RA值。

我用过这个:

data2 = data2.drop(data2[str(data2['RA'])[0:5] is not str(126.1)].index)

其中data2是我的数据帧。

它返回错误“KeyError:True”。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

有很多错误:

str(data2['RA'])[0:5] is not str(126.1)

首先,is not将评估为TrueFalse,但您正在尝试创建布尔数组以供选择,因此,这是误导的。其次,您应该从不使用is来比较str对象的开头。对于pandas.Series对象上的这些字符串操作,可以通过.str访问内置的矢量化方法,它们模仿内置的字符串方法。所以给出:

>>> df
          File      Date          Time          RA        Dec
0  ad0147.fits  18-02-13  22:26:01.779  126.109510  27.360011
1  ad0147.fits  18-02-13  22:26:01.779  126.061077  27.361124
2  ad0147.fits  18-02-13  22:26:01.779  125.994430  27.363504
>>> df.dtypes
File     object
Date     object
Time     object
RA      float64
Dec     float64
dtype: object

您可以使用:

>>> df.RA.astype(str).str.startswith('126.1')
0     True
1    False
2    False
Name: RA, dtype: bool

简单地将它与布尔索引结合起来:

>>> df[df.RA.astype(str).str.startswith('126.1')]
          File      Date          Time         RA        Dec
0  ad0147.fits  18-02-13  22:26:01.779  126.10951  27.360011

答案 1 :(得分:0)

查看任何Pandas系列上可用的.str方法(这是数据框的列是什么)。它支持正则表达式语法。我经常搜索我不想要的东西,然后用〜来否定它。像这样:

df = df[~df.RA.str.contains('126.1')]