Pandas fillna с использованием groupby и mode

Я недавно начал работать с Pandas, и в настоящее время я пытаюсь вменять некоторые недостающие значения в свой набор данных.

Я хочу вменять недостающие значения на основе медианы (для числовых записей) и режима (для категориальных записей). Однако я не хочу рассчитывать медианное значение и режим для всего набора данных, а на основе GroupBy моего столбца с именем "make".

Для числовых значений я сделал следующее:

data = data.fillna(data.groupby("make").transform("median"))

-> это работает отлично и заменяет все мои числовые NA значения на медиану их "make".

Однако мне не удалось сделать то же самое для режима, т.е. заменить все категориальные значения NA на режим их "make".

кто нибудь знает как это сделать?


person mt1212    schedule 01.12.2019    source источник


Ответы (1)


Вы можете использовать _1 _ с if-else для median для числовых и mode для категориальных столбцов:

df = pd.DataFrame({
         'A':list('ebcded'),
         'B':[np.nan,np.nan,4,5,5,4],
         'C':[7,np.nan,9,4,2,3],
         'D':[1,3,5,np.nan,1,0],
         'F':list('aaabbb'),
         'G':list('aaabbb')
})

df.loc[[2,4], 'A'] = np.nan
df.loc[[2,5], 'F'] = np.nan
print (df)
     A    B    C    D    F  G
0    e  NaN  7.0  1.0    a  a
1    b  NaN  NaN  3.0    a  a
2  NaN  4.0  9.0  5.0  NaN  a
3    d  5.0  4.0  NaN    b  b
4  NaN  5.0  2.0  1.0    b  b
5    d  4.0  3.0  0.0  NaN  b

f = lambda x: x.median() if np.issubdtype(x.dtype, np.number) else x.mode().iloc[0]
df = df.fillna(df.groupby('G').transform(f))
print (df)

   A  B  C  D  F  G
0  e  4  7  1  a  a
1  b  4  7  3  a  a
2  b  4  9  5  a  a
3  d  5  4  0  b  b
4  d  5  2  1  b  b
5  d  4  3  0  b  b
person jezrael    schedule 01.12.2019
comment
Большое тебе спасибо! Я попробовал это с вашими фиктивными данными, и это сработало. К сожалению, когда я пробую использовать его в своем наборе данных, я получаю IndexError: «Единственный позиционный индексатор выходит за границы». Может ли это быть из-за того, что для некоторых GroupBy of make есть только значения NaN, что делает невозможным вычисление медианы или режима? Есть идеи, что я могу сделать, чтобы обойти эту проблему (например, если в группе находится только NaN, тогда использовать общую медиану / режим ..)? - person mt1212; 01.12.2019
comment
@ mt1212 вы можете проверить изменение x.mode(). iloc[0] на next(iter(x.mode()), np.nan)? - person jezrael; 01.12.2019
comment
@ mt1212 - Супер! Если мой ответ был полезен, не забудьте принять его. Спасибо. - person jezrael; 02.12.2019