【发布时间】:2014-08-22 23:08:53
【问题描述】:
我正在尝试使用列表函数过滤包含columns A 和B 的熊猫数据框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函数,分别如何完成这个过滤?
谢谢。
【问题讨论】:
-
请您发布数据和代码、python、pandas 和 numpy 版本,以便我们重现您的错误,谢谢。
-
目前还不清楚您正在寻找什么答案。您希望
limit[floor(df['B'])]评估为什么?只需键入几行所需的输出(很明显它不是实际的)。我认为使用 limit[] 您正在尝试创建索引,但我不知道您要使用 floor() 完成什么。 -
特别是关于限制,我认为它的行为不像你期望的那样,但如果你把它变成一个 numpy 数组,那么它可能会。
-
可能这不是一种非常“pythonic”的方式,也不是一种优雅的方式,但数组
limit仅定义了值 A 的下限,这取决于值 B。我已将其制成表格限制为每个整数的值,这就是floor的含义。 -
进一步解释,否则可能不清楚:我已将限制“函数”作为 B 的每个整数的值,由索引表示,因此 limit[1] 是从 1 到 1.99 的所有值,将 [2] 限制为 2 到 2.99,...