gpt4 book ai didi

python - 将多个过滤器应用于 pandas DataFrame 或 Series 的有效方法

转载 作者:IT老高 更新时间:2023-10-28 21:06:14 25 4
gpt4 key购买 nike

我有一个场景,用户想要对 Pandas DataFrame 或 Series 对象应用多个过滤器。本质上,我想有效地将​​用户在运行时指定的一组过滤(比较操作)链接在一起。

  • 过滤器应该是additive(也就是每一个应用都应该缩小结果)。
  • 我目前正在使用 reindex()(如下所示),但这每次都会创建一个新对象并复制基础数据(如果我正确理解文档的话)。我想避免这种不必要的复制,因为在过滤大型系列或 DataFrame 时效率非常低。
  • 我认为使用 apply()map() 或类似的东西可能会更好。虽然我对 Pandas 还很陌生,但我仍然想尽一切办法解决所有问题。
  • 另外,我想扩展它,以便传入的字典可以包含要操作的列,并根据输入字典过滤整个 DataFrame。不过,我假设适用于 Series 的任何东西都可以轻松扩展为 DataFrame。

TL;DR

我想获取以下形式的字典并将每个操作应用于给定的 Series 对象并返回“过滤”的 Series 对象。

relops = {'>=': [1], '<=': [1]}

长示例

我将从我目前拥有的示例开始,并仅过滤单个 Series 对象。以下是我目前正在使用的功能:

   def apply_relops(series, relops):
"""
Pass dictionary of relational operators to perform on given series object
"""
for op, vals in relops.iteritems():
op_func = ops[op]
for val in vals:
filtered = op_func(series, val)
series = series.reindex(series[filtered])
return series

用户提供一个字典,其中包含他们想要执行的操作:

>>> df = pandas.DataFrame({'col1': [0, 1, 2], 'col2': [10, 11, 12]})
>>> print df
>>> print df
col1 col2
0 0 10
1 1 11
2 2 12

>>> from operator import le, ge
>>> ops ={'>=': ge, '<=': le}
>>> apply_relops(df['col1'], {'>=': [1]})
col1
1 1
2 2
Name: col1
>>> apply_relops(df['col1'], relops = {'>=': [1], '<=': [1]})
col1
1 1
Name: col1

同样,我上述方法的“问题”是我认为中间步骤可能有很多不必要的数据复制。

最佳答案

Pandas(和 numpy)允许 boolean indexing ,这将更有效率:

In [11]: df.loc[df['col1'] >= 1, 'col1']
Out[11]:
1 1
2 2
Name: col1

In [12]: df[df['col1'] >= 1]
Out[12]:
col1 col2
1 1 11
2 2 12

In [13]: df[(df['col1'] >= 1) & (df['col1'] <=1 )]
Out[13]:
col1 col2
1 1 11

如果您想为此编写辅助函数,请考虑以下方面的内容:

In [14]: def b(x, col, op, n): 
return op(x[col],n)

In [15]: def f(x, *b):
return x[(np.logical_and(*b))]

In [16]: b1 = b(df, 'col1', ge, 1)

In [17]: b2 = b(df, 'col1', le, 1)

In [18]: f(df, b1, b2)
Out[18]:
col1 col2
1 1 11

更新:pandas 0.13 has a query method对于这类用例,假设列名是有效的标识符,则以下工作(并且对于大帧更有效,因为它在幕后使用 numexpr):

In [21]: df.query('col1 <= 1 & 1 <= col1')
Out[21]:
col1 col2
1 1 11

关于python - 将多个过滤器应用于 pandas DataFrame 或 Series 的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13611065/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com