Почему `.first()` и почему перед `.over()` в цепочке композиции функции выражения `with_columns`Python

Программы на Python
Ответить
Anonymous
 Почему `.first()` и почему перед `.over()` в цепочке композиции функции выражения `with_columns`

Сообщение Anonymous »

новичок в Polars, прошу помощи в понимании того, почему часть композиции функции для выражения в приведенном ниже фрагменте .with_columns() должна выполняться именно в этом конкретном порядке.
В частности, я не понимаю, почему необходим вызов .first() и (учитывая, что он кажется необходимым), почему он должен идти перед вызовом .over("instance").
(Цель кода — вычислить коэффициент, на который значение каждого экземпляра отличается от значения того же экземпляра в категории A; да, результат не имеет значения для строк в категории A.)

Код: Выделить всё

>>> df = pl.DataFrame({"category": ["A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D"], "instance": [1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4], "value": [7,444,0,99,50,60,70,80,90,80,70,60,50,60,70,80]})
>>> df
shape: (16, 3)
┌──────────┬──────────┬───────┐
│ category ┆ instance ┆ value │
│ ---      ┆ ---      ┆ ---   │
│ str      ┆ i64      ┆ i64   │
╞══════════╪══════════╪═══════╡
│ A        ┆ 1        ┆ 7     │
│ A        ┆ 2        ┆ 444   │
│ A        ┆ 3        ┆ 0     │
│ A        ┆ 4        ┆ 99    │
│ B        ┆ 1        ┆ 50    │
│ B        ┆ 2        ┆ 60    │
│ B        ┆ 3        ┆ 70    │
│ B        ┆ 4        ┆ 80    │
│ C        ┆ 1        ┆ 90    │
│ C        ┆ 2        ┆ 80    │
│ C        ┆ 3        ┆ 70    │
│ C        ┆ 4        ┆ 60    │
│ D        ┆ 1        ┆ 50    │
│ D        ┆ 2        ┆ 60    │
│ D        ┆ 3        ┆ 70    │
│ D        ┆ 4        ┆ 80    │
└──────────┴──────────┴───────┘
>>> df.with_columns(
...     (
...             pl.col("value")
...             .filter(pl.col("category") == "A")
...             .first()
...             .over("instance")
...             / pl.col("value")
...     ).alias("factor")
... )
shape: (16, 4)
┌──────────┬──────────┬───────┬──────────┐
│ category ┆ instance ┆ value ┆ factor   │
│ ---      ┆ ---      ┆ ---   ┆ ---      │
│ str      ┆ i64      ┆ i64   ┆ f64      │
╞══════════╪══════════╪═══════╪══════════╡
│ A        ┆ 1        ┆ 7     ┆ 1.0      │
│ A        ┆ 2        ┆ 444   ┆ 1.0      │
│ A        ┆ 3        ┆ 0     ┆ NaN      │
│ A        ┆ 4        ┆ 99    ┆ 1.0      │
│ B        ┆ 1        ┆ 50    ┆ 0.14     │
│ B        ┆ 2        ┆ 60    ┆ 7.4      │
│ B        ┆ 3        ┆ 70    ┆ 0.0      │
│ B        ┆ 4        ┆ 80    ┆ 1.2375   │
│ C        ┆ 1        ┆ 90    ┆ 0.077778 │
│ C        ┆ 2        ┆ 80    ┆ 5.55     │
│ C        ┆ 3        ┆ 70    ┆ 0.0      │
│ C        ┆ 4        ┆ 60    ┆ 1.65     │
│ D        ┆ 1        ┆ 50    ┆ 0.14     │
│ D        ┆ 2        ┆ 60    ┆ 7.4      │
│ D        ┆ 3        ┆ 70    ┆ 0.0      │
│ D        ┆ 4        ┆ 80    ┆ 1.2375   │
└──────────┴──────────┴───────┴──────────┘
>>>
Для изучения я попробовал изменить порядок на [...].over("instance").first()[...], который мне кажется более интуитивным, но затем получил ShapeError. Я также попробовал .item() вместо .first(), что кажется лучше, поскольку гарантирует, что существует только одно значение - гарантия, которую мне бы хотелось иметь - но, к сожалению, .item() можно вызывать только в DataFrame, а не внутри выражения. (Есть ли способ включить такую ​​гарантию «встроенно» в выражение?) Я прочитал документацию по каждой из функций, но у меня возникли проблемы с концептуальным объединением всего этого.

Подробнее здесь: https://stackoverflow.com/questions/797 ... n-function
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»