Пока вы можете категоризировать шаг, как то, что возвращает DataFrame и принимает DataFrame (возможно, с большим количеством аргументов), то вы можете использовать pipe
. Есть ли преимущество для этого, это еще один вопрос.
Здесь, например, вы можете использовать
df\
.pipe(lambda df_, x, y: df_[(df_.a >= x) & (df_.b <= y)], 2, 8)\
.pipe(lambda df_: df_.groupby(df_.x))\
.mean()
Обратите внимание, как первый этап лямбда, который принимает 3 аргумента, с 2 и 8, переданного в качестве параметров. Это не единственный способ сделать это - это эквивалентно
.pipe(lambda df_: df_[(df_.a >= 2) & (df_.b <= 8)])\
Также обратите внимание, что вы можете использовать
df\
.pipe(lambda df_, x, y: df[(df.a >= x) & (df.b <= y)], 2, 8)\
.groupby('x')\
.mean()
Здесь лямбда принимает df_
, но работает на df
, а второй pipe
было заменен на groupby
.
Первое изменение работает здесь, но является gragile. Это происходит работать, так как это первый трубы этапе. Если это будет более поздний этап, он может взять DataFrame с одним измерением и попытаться отфильтровать его на маске с другим измерением, например.
Второе изменение - это хорошо. На лице я думаю, что это более читаемо. В принципе, все, что принимает DataFrame и возвращает один, может быть вызвано напрямую или через pipe
.
Я не понимаю, почему использование 'pipe' было бы полезно здесь. 'df [(df.a> = 2) & (df.b <= 8)]. groupby ('x'). mean()' будет делать то же самое, не так ли? – jme
Это правда @jme, это пример игрушки, и в моем более крупном коде у меня больше шагов. Кроме того, оператор '.' заставляет все выглядеть аккуратно. – user308827
Это либо дежа-вю, либо [дубликат] (http://stackoverflow.com/questions/35045805) :-) – Primer