【问题标题】:Filtering pandas data frame with tabulated function用表格函数过滤熊猫数据框
【发布时间】:2014-08-22 23:08:53
【问题描述】:

我正在尝试使用列表函数过滤包含columns AB 的熊猫数据框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,...

标签: python filter pandas


【解决方案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 列表。

【讨论】:

  • 太好了,非常感谢。我刚刚在过滤语句df [ df['A'] > lim[ df.B.astype(int).values ] ] 中包含了您的解决方案(我想避免重复数据,因为我有大量数据)。
  • 是的,这就是这里的传统方式!如果您有更高的代表,您还可以投票并根据需要给予多个答案。
  • 我的大数据集中 B 中有 NaN 值,当被解释为 int 时会产生问题。我确信有一种非常优雅且简短的方法可以解决这个问题,但我还没有找到。也许有人会给我一个提示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2021-12-01
  • 2019-04-13
  • 2015-05-28
  • 2018-02-06
  • 2018-09-28
  • 1970-01-01
相关资源
最近更新 更多