pandas eval не поддерживает where

#pandas

#pandas

Вопрос:

pandas eval использует numexpr, который поддерживает эту where функцию. Почему pandas, похоже, не поддерживает это?

 df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,5]})
df.eval("where(a > 1, b ** 2, 2 * b)")

# -> ValueError: "where" is not a supported function
 

Есть обходной путь? Единственное, что я вижу, это

 df.eval("(a > 1) * (b ** 2)   (~(a > 1)) * (2 * b)")
 

но не очень эффективно. Другим решением может быть:

 df.eval("cond = (a > 1)n res= a * (b ** 2)   (~cond) * (2 * b)")
 

это может быть более эффективным, но оно присваивает два новых столбца df , которые нежелательны.

Ответ №1:

Вот обобщение ответа Хоанга. Идея состоит в том, чтобы использовать DataFrame в качестве dict, который numexpr может использовать для прямого поиска данных. Это позволяет использовать любое поле в фрейме данных в выражении без необходимости предварительного создания ссылки.

 import numexpr as ne

# specify to numexpr to use the dataframe as a local dict
ne.evaluate('where(a>1, b**2, 2*b)', local_dict=df)
 

Ответ №2:

Вы можете разрешить собственный вызов numexpr:

 a,b=df['a'],df['b']
ne.evaluate('where(a>1, b**2, 2*b)')
# 44.5 µs ± 13 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
 

Против:

 df.eval("(a > 1) * (b ** 2)   (~(a > 1)) * (2 * b)")
# 1.99 ms ± 47.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
 

Комментарии:

1. это копирование памяти в первой строке?

2. @RuggeroTurra обычно нет.