我正在尝试使用列表函数过滤包含columns A
和B
的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
函数,分别如何完成这个过滤?
感谢。
答案 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列表。