Я использую библиотеку Polars в Python для управления некоторыми кадрами данных.
Я пытаюсь сделать следующее: :
Для некоторого фрейма данных:
Я хочу вернуть «расстояние» между текущей парой бойцов и их первым боем, например: :
<Что я пробовал>:
Есть ли у кого-нибудь совет, как это сделать?
Я думаю, что мне, возможно, придется использовать некоторую комбинацию «group_by» или «over», «first» и, возможно, «sub» (чтобы вычесть две даты?), но я не уверен, как действовать. Самое сложное для меня — попытаться извлечь первую запись данной группы (например, первую запись даты пары A-B или пары AC и т. д.).






Вот один из способов сделать это:
Сгруппируйте фрейм данных по [person, fight_with], выберите минимум on, а затем соедините его с исходным фреймом данных.
Вот код:
import polars as pl
df = pl.DataFrame(
{
"person": ["A", "A", "A", "A", "A", "A", "A"],
"fight_with": ["B", "C", "D", "E", "B", "B", "C"],
"on": [3, 4, 5, 5, 10, 20, 20],
}
)
first_fight = df.group_by("person", "fight_with").agg(pl.min("on").alias("min_on"))
df = df.join(first_fight, on=["person", "fight_with"]).with_columns(
distance=pl.col("on") - pl.col("min_on")
)
print(df)
Выход:
shape: (7, 5)
┌────────┬────────────┬─────┬────────┬──────────┐
│ person ┆ fight_with ┆ on ┆ min_on ┆ distance │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ i64 ┆ i64 ┆ i64 │
╞════════╪════════════╪═════╪════════╪══════════╡
│ A ┆ B ┆ 3 ┆ 3 ┆ 0 │
│ A ┆ C ┆ 4 ┆ 4 ┆ 0 │
│ A ┆ D ┆ 5 ┆ 5 ┆ 0 │
│ A ┆ E ┆ 5 ┆ 5 ┆ 0 │
│ A ┆ B ┆ 10 ┆ 3 ┆ 7 │
│ A ┆ B ┆ 20 ┆ 3 ┆ 17 │
│ A ┆ C ┆ 20 ┆ 4 ┆ 16 │
└────────┴────────────┴─────┴────────┴──────────┘
Да, pl.first("on") даст тот же результат быстрее, если ваш массив отсортирован по on.
Как вы уже сказали, вы можете получить первый .over() каждой группы.
df.with_columns(
pl.format("{} - {}", pl.col("On"), pl.col("On").first())
.over("Person..", "Fight with")
)
shape: (7, 3)
┌──────────┬────────────┬────────────────┐
│ Person.. ┆ Fight with ┆ On │
│ --- ┆ --- ┆ --- │
│ str ┆ str ┆ str │
╞══════════╪════════════╪════════════════╡
│ A ┆ B ┆ 3 Jan - 3 Jan │
│ A ┆ C ┆ 4 Jan - 4 Jan │
│ A ┆ D ┆ 5 Jan - 5 Jan │
│ A ┆ E ┆ 5 Jan - 5 Jan │
│ A ┆ B ┆ 10 Jan - 3 Jan │
│ A ┆ B ┆ 20 Jan - 3 Jan │
│ A ┆ C ┆ 20 Jan - 4 Jan │
└──────────┴────────────┴────────────────┘
См. Функции окна в руководстве пользователя:
Спасибо! В качестве примечания можно также использовать следующее: agg(pl.first("on")