#python #pandas #pandas-groupby #python-polars
Вопрос:
Я ломаю голову, пытаясь понять, как использовать groupby
apply
поляры в библиотеке Python и в ней.
Исходя из Панд, я использовал:
def get_score(df): return spearmanr(df["prediction"], df["target"]).correlation correlations = df.groupby("era").apply(get_score)
Но в полярных сияниях это не работает.
Я попробовал несколько подходов, в основном вокруг:
correlations = df.groupby("era").apply(get_score)
Но это не удается с сообщением об ошибке:
«Может ли сеть получить атрибут фрейма данных «_df». Убедитесь, что вы возвращаете объект фрейма данных.: PyErr { тип: lt;класс ‘Ошибка атрибута’gt;, значение: ошибка атрибута («объект’numpy.float64’ не имеет атрибута ‘_df'»),
Есть какие-нибудь идеи?
Комментарии:
1. Не могли бы вы предоставить образец, пожалуйста?
Ответ №1:
По polarsgt;=0.10.4
состоянию на вас вы можете использовать эту pl.spearman_rank_corr
функцию.
Если вы хотите использовать пользовательскую функцию, вы можете сделать это следующим образом:
Пользовательская функция для нескольких столбцов/выражений
import polars as pl from typing import List from scipy import stats df = pl.DataFrame({ "g": [1, 1, 1, 2, 2, 2, 5], "a": [2, 4, 5, 190, 1, 4, 1], "b": [1, 3, 2, 1, 43, 3, 1] }) def get_score(args: List[pl.Series]) -gt; pl.Series: return pl.Series([stats.spearmanr(args[0], args[1]).correlation], dtype=pl.Float64) (df.groupby("g", maintain_order=True) .agg( pl.apply( exprs=["a", "b"], f=get_score).alias("corr") ))
Поляры обеспечивали функцию
(df.groupby("g", maintain_order=True) .agg( pl.spearman_rank_corr("a", "b").alias("corr") ))
Оба вывода:
shape: (3, 2) ┌─────┬──────┐ │ g ┆ corr │ │ --- ┆ --- │ │ i64 ┆ f64 │ ╞═════╪══════╡ │ 1 ┆ 0.5 │ ├╌╌╌╌╌┼╌╌╌╌╌╌┤ │ 2 ┆ -1e0 │ ├╌╌╌╌╌┼╌╌╌╌╌╌┤ │ 5 ┆ NaN │ └─────┴──────┘
Пользовательская функция для одного столбца/выражения
Мы также можем применять пользовательские функции к отдельным выражениям с помощью .apply
или .map
.
Ниже приведен пример того, как мы можем выровнять столбец с помощью пользовательской функции и с помощью обычных выражений полярности. Синтаксис выражения всегда должен быть предпочтительным, так как он намного быстрее.
(df.groupby("g") .agg( pl.col("a").apply(lambda group: group**2).alias("squared1"), (pl.col("a")**2).alias("squared2") ))
в чем разница между apply
и map
?
map
работает на всю колонку series
. apply
работает с отдельными значениями или отдельными группами, в зависимости от контекста.
select
контекст:
map
- тип ввода/вывода:
Series
- семантическое значение входных данных: значение столбца
- тип ввода/вывода:
apply
- тип ввода/вывода:
Union[int, float, str, bool]
- семантическое значение входных данных: отдельные значения в столбце
- тип ввода/вывода:
groupby
контекст:
map
- тип ввода/вывода:
Series
- семантическое значение ввода: столбец списка, в котором значениями являются группы
- тип ввода/вывода:
apply
- тип ввода/вывода:
Series
- семантическое значение входных данных: Группы
- тип ввода/вывода:
Комментарии:
1. Спасибо @ritchie46. Это сработало идеально.