Как применить окно case-когда функции на pandas группах - PullRequest
1 голос
/ 10 апреля 2020

У меня есть таблица с двумя столбцами идентификаторов w и x. Столбцы y вносят порядок в столбец z, который является целевой переменной. Каждая последовательность, обозначенная w и x, имеет как минимум две строки и все различные значения в z. Я хочу посчитать для каждого из z s, как часто они встречаются в последовательностях, в которых позиция. По позиции меня интересует, первый это, последний или какой-либо другой. Мой подход в R dplyr заключается в следующем (для тех, кто не знаком с %>%, это оператор канала, который берет вывод левой руки и помещает его в качестве первого аргумента в функцию правой руки, вы можете прочитать его как «и затем» ):

library(tidyverse)
library(reticulate)

data <- tribble(
  ~w,   ~x,  ~y,   ~z,
   1,    1,    1,  "a",
   1,    1,    2,  "b",
   1,    2,    1,  "b",
   1,    2,    2,  "a",
   1,    2,    3,  "c",
   1,    2,    4,  "d",
   2,    1,    1,  "b",
   2,    1,    2,  "a",
   2,    1,    3,  "c",
   2,    1,    4,  "d"
)

Сначала я добавляю индекс последовательности к каждой упорядоченной группе w и x и маркер, определяющий категориальную позицию z в последовательности из нее (position_in_sequence ).

data_with_markers <- 
  data %>%
  group_by(w, x) %>%
  arrange(y, .by_group = TRUE) %>%
  mutate(
    sequence_id = row_number(),
    position_in_sequence = case_when(
      sequence_id == first(sequence_id) ~ "first",
      sequence_id == last(sequence_id) ~ "last",
      TRUE ~ "other" # this is the "else"
    )
  ) %>%
  ungroup()


>data_with_markers
# A tibble: 10 x 6
       w     x     y z     sequence_id position_in_sequence 
   <dbl> <dbl> <dbl> <chr>       <int> <chr>
 1     1     1     1 a               1 first
 2     1     1     2 b               2 last 
 3     1     2     1 b               1 first
 4     1     2     2 a               2 other
 5     1     2     3 c               3 other
 6     1     2     4 d               4 last 
 7     2     1     1 b               1 first
 8     2     1     2 a               2 other
 9     2     1     3 c               3 other
10     2     1     4 d               4 last 

Затем я делаю простой подсчет по position_in_sequence и z.

data_summary <- data_with_markers %>% 
  group_by(position_in_sequence, z) %>% 
  count() %>% 
  ungroup()

> data_summary
# A tibble: 6 x 3
  position_in_sequence  z         n
  <chr> <chr> <int>
1 first a         1
2 first b         2
3 last  b         1
4 last  d         2
5 other a         2
6 other c         2

Для pandas я застрял с получением position_in_sequence переменная (я использую пакет reticulate здесь):

import pandas as pd
data = r.data
data

     w    x    y  z
0  1.0  1.0  1.0  a
1  1.0  1.0  2.0  b
2  1.0  2.0  1.0  b
3  1.0  2.0  2.0  a
4  1.0  2.0  3.0  c
5  1.0  2.0  4.0  d
6  2.0  1.0  1.0  b
7  2.0  1.0  2.0  a
8  2.0  1.0  3.0  c
9  2.0  1.0  4.0  d

data_sorted = data.sort_values(['w', 'x', 'y'])

data_sorted['sequence_id'] = data_sorted.groupby(['w', 'x']).cumcount() + 1
data_sorted

     w    x    y  z  sequence_id
0  1.0  1.0  1.0  a            1
1  1.0  1.0  2.0  b            2
2  1.0  2.0  1.0  b            1
3  1.0  2.0  2.0  a            2
4  1.0  2.0  3.0  c            3
5  1.0  2.0  4.0  d            4
6  2.0  1.0  1.0  b            1
7  2.0  1.0  2.0  a            2
8  2.0  1.0  3.0  c            3
9  2.0  1.0  4.0  d            4

Я возился с .apply, но мне нужно было бы получить доступ к столбцу sequence_id в определенной строке и минимуме столбца и Макс одновременно для сравнения, но я не получил его на работу.

1 Ответ

0 голосов
/ 10 апреля 2020

Я не уверен, поможет ли это, но я вижу, что вы использовали переменную с именем "type", этот код может выдавать ошибку, потому что "type" является ключевым словом и, вероятно, не лучшим выбором для имени переменной / столбца. попробовать "type1" или "typ"? Присвоение ключевого слова в качестве переменной обычно изначально не доставляет проблем, но позже оставляет вас с необъяснимыми ошибками (я здесь просто мозговой штурм, я не использовал reticulate)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...