Сгруппированный режим панд и пропущенные значения - PullRequest
0 голосов
/ 30 июня 2019

У меня есть данные, подобные таблице ниже:

Type  Size    Color   Color2
cat   small   white   white
cat   small   white   white
cat   large   brown   #N/A
cat   large   black   #N/A
dog   large   white   white
dog   small   black   black
cat   small   white   white
dog   small   brown   brown
dog   small   brown   brown
dog   small   brown   brown
cat   large   brown   #N/A
cat   large   brown   #N/A
dog   large   #N/A    brown
dog   large   white   white
dog   large   black   black
cat   large   white   #N/A
dog   large   brown   brown
cat   small   white   white
cat   small   white   white
dog   large   brown   brown
dog   large   white   white
dog   large   #N/A    brown
dog   small   black   black
cat   small   white   white
dog   small   white   white
dog   small   white   white
cat   small   white   white
dog   small   black   black
dog   small   black   black
dog   large   brown   brown
dog   large   brown   brown
cat   large   black   #N/A
cat   small   white   white

Цель состоит в том, чтобы заполнить пропущенные значения в цвете и цвете 2 с помощью режима соответствующего столбца, обусловленного типом и размером.

Приведенный ниже фрагмент хорошо работает для столбца «Цвет» и игнорирует пропущенные значения в столбце «Цвет»

df.groupby(['Type','Size'])['Color'].transform(lambda x: x.mode()[0])

Однако мои фактические данные напоминают происходящее в столбце Color2. В этом столбце отсутствуют все значения Color2, соответствующие значению cat large. Таким образом, когда я применяю приведенный ниже фрагмент кода, я получаю ошибку индекса за пределами границ.

df.groupby(['Type','Size'])['Color2'].transform(lambda x: x.mode()[0]) 

Я хочу иметь возможность возвращать NaN / # N / A, если в определенной группе есть только пропущенные значения, но возвращать режим, игнорируя при этом пропущенные значения, если в группе есть пропущенные значения.

Ответы [ 2 ]

1 голос
/ 30 июня 2019

Вместо [0], просто используйте .get(0,'NaN/#N/A') в вашей команде.Он выберет значение по умолчанию 'NaN/#N/A', если ключ не найден.

df['new_color'] = df.groupby(['Type','Size'])['Color2'] \
                    .transform(lambda x: x.mode().get(0,'NaN/#N/A'))

Out[1246]:
   Type   Size  Color Color2 new_color
0   cat  small  white  white     white
1   cat  small  white  white     white
2   cat  large  brown    NaN  NaN/#N/A
3   cat  large  black    NaN  NaN/#N/A
4   dog  large  white  white     brown
5   dog  small  black  black     black
6   cat  small  white  white     white
7   dog  small  brown  brown     black
8   dog  small  brown  brown     black
9   dog  small  brown  brown     black
10  cat  large  brown    NaN  NaN/#N/A
11  cat  large  brown    NaN  NaN/#N/A
12  dog  large    NaN  brown     brown
13  dog  large  white  white     brown
14  dog  large  black  black     brown
15  cat  large  white    NaN  NaN/#N/A
16  dog  large  brown  brown     brown
17  cat  small  white  white     white
18  cat  small  white  white     white
19  dog  large  brown  brown     brown
20  dog  large  white  white     brown
21  dog  large    NaN  brown     brown
22  dog  small  black  black     black
23  cat  small  white  white     white
24  dog  small  white  white     black
25  dog  small  white  white     black
26  cat  small  white  white     white
27  dog  small  black  black     black
28  dog  small  black  black     black
29  dog  large  brown  brown     brown
30  dog  large  brown  brown     brown
31  cat  large  black    NaN  NaN/#N/A
32  cat  small  white  white     white
0 голосов
/ 30 июня 2019

Проверка с value_counts

df.fillna(df.groupby(['Type','Size']).transform(lambda x : x.value_counts(dropna=False).index[0]),inplace=True)

Или в 0.24 вы также можете передать dropna=False в mode

df.groupby(['Type','Size'])['Color2'].transform(lambda x: x.mode(dropna=False)[0]) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...