#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 обычно нет.