[Pandas-dev] Chained filtering with lazy evaluation ("where")

Tom Augspurger tom.augspurger88 at gmail.com
Thu Mar 22 11:27:52 EDT 2018


Sounds like someone's been learning from David Beazley :)

Now just define DataFrame.__enter__ to pass `self` to `ctx`, and write it as

```
with df:
   print(df[a == 1])
```

On Thu, Mar 22, 2018 at 10:24 AM, Phillip Cloud <cpcloud at gmail.com> wrote:

> If you feel like being evil, you can use a so-called “frame hack” + a
> context manager:
>
> In [1]: import pandas as pd
>    ...: import contextlib
>    ...: import sys
>    ...:
>    ...:
>    ...: class ctx:
>    ...:     def __init__(self, df):
>    ...:         self.df = df
>    ...:         current_frame = sys._getframe(0)
>    ...:         self.locals = current_frame.f_back.f_locals
>    ...:         self.existing_values = {
>    ...:             k: self.locals[k] for k in df.columns
>    ...:             if k in self.locals
>    ...:         }
>    ...:         self.new_values = {k for k in df.columns if k not in self.locals}
>    ...:
>    ...:     def __enter__(self):
>    ...:         for k in df.columns:
>    ...:             self.locals[k] = df[k]
>    ...:         return
>    ...:
>    ...:     def __exit__(self, *exc):
>    ...:         self.locals.update(self.existing_values)
>    ...:         for k in self.new_values:
>    ...:             del self.locals[k]
>    ...:
>
> In [2]: df = pd.DataFrame({'a': np.array([1, 2], dtype='float32')})
>
> In [3]: try:
>    ...:     a + 1
>    ...: except NameError:
>    ...:     print("'a' doesn't exist yet!")
>    ...:
> 'a' doesn't exist yet!
>
> In [4]: with ctx(df):
>    ...:     print(df[a == 1])
>    ...:
>      a
> 0  1.0
>
> In [5]: try:
>    ...:     a + 1
>    ...: except NameError:
>    ...:     print("'a' doesn't exist yet!")
>    ...:
> 'a' doesn't exist yet!
>
>>
> On Thu, Mar 22, 2018 at 10:35 AM Pietro Battiston <ml at pietrobattiston.it>
> wrote:
>
>> Il giorno gio, 15/03/2018 alle 15.10 -0400, Justin Lewis ha scritto:
>> > I might be missing the point but can you use .pipe()?
>>
>> Indeed, this is something else I had not considered.
>>
>> However I don't like it to much. Compare
>>
>> .loc[W]
>>
>> with
>>
>> .pipe(lambda df : df[df])
>>
>> By the way,
>>
>> .loc[lambda df : df[df]]
>>
>> is equivalent but cleaner to me (after all, we are selecting).
>>
>> This said, the solutions proposed by you and Chris are indeed more
>> robust then mine. For instance,
>>
>> .loc[W + 1 > 2]
>>
>> works but
>>
>> .loc[2 < 1 + W]
>>
>> doesn't, and I don't even know if a fix is possible.
>>
>> Pietro
>> _______________________________________________
>> Pandas-dev mailing list
>> Pandas-dev at python.org
>> https://mail.python.org/mailman/listinfo/pandas-dev
>>
>
> _______________________________________________
> Pandas-dev mailing list
> Pandas-dev at python.org
> https://mail.python.org/mailman/listinfo/pandas-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/pandas-dev/attachments/20180322/4e383a3d/attachment-0001.html>


More information about the Pandas-dev mailing list