使用列表函数过滤pandas数据框

时间:2014-08-22 11:20:23

标签: python filter pandas

我正在尝试使用列表函数过滤包含columns AB的pandas数据框df:我想保留df.B值超出相关限制的所有值在df.A上,即df.B>limit[i],其中i的计算方式为df.A i=floor(df.A)

不幸的是,我对Python没有经验。但我很清楚,元素方面的比较是非常低效的,我发现函数df.query似乎对此有所帮助,但我没有成功。

Excerpt of the data frame df:

datetime             A     B          
2014-05-31 03:30:00  2201  18.2
2014-05-31 03:40:00  2208  18.7
2014-05-31 03:50:00  2205  20.6
2014-05-31 04:00:00  2202  19.9
2014-05-31 04:10:00    22  18.2
2014-05-31 04:20:00  2204  18.2
2014-05-31 04:30:00  2198  18.1
2014-05-31 04:40:00  2204  19.1
2014-05-31 04:50:00  2202  20.3
2014-05-31 05:00:00  2205  20.8
...

limit = [  0.0,    10.0,   40.0,   100.0,   240.0,   300.0,   480.0, 800.0,  1000.0, 1400.0,  1600.0,  1800.0,  
1900.0,  1900.0, 1900.0,  1900.0, 1900.0,  1900.0,  1900.0,  1900.0,  1900.0  ]

我尝试了以下内容:

In [54]: df.query ( "df['A'] > limit[floor(df['B'])]")
... 
NotImplementedError: 'Call' nodes are not implemented

In [55]: df.query ( "df['A'] > limit[floor(2.3)]")
...
NotImplementedError: 'Call' nodes are not implemented

In [56]: df.query ( "df['A'] > limit[12]" )
Out[56]:     
datetime             A     B          
2014-05-31 03:30:00  2201  18.2
2014-05-31 03:40:00  2208  18.7
2014-05-31 03:50:00  2205  20.6
...

(it works)

我使用Python 2.7.6.2,Numpy 1.8.0和Pandas 0.13.0

任何人都可以解释一下为什么我不能在这个表达式中使用floor函数,分别如何完成这个过滤?

感谢。

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试做这样的事情?

lim = np.array(limit)
df['C'] = lim[ df.B.astype(int).values ]

      A     B     C
0  2201  18.2  1900
1  2208  18.7  1900
2  2205  20.6  1900

我只是使用整数截断而不是地板来保存步骤。而且我认为无论你想要做什么,你都需要使用numpy数组而不是python列表。