Как заменить отсутствующие значения групповым режимом в Pandas? - PullRequest
1 голос
/ 07 апреля 2019

Я следую методу из этого поста , чтобы заменить пропущенные значения групповым режимом, но обнаруживаю "IndexError: index out of bounds".

 df['SIC'] = df.groupby('CIK').SIC.apply(lambda x: x.fillna(x.mode()[0]))

Полагаю, это возможно потому, что в некоторых группах отсутствуют все значения и отсутствует режим. Есть ли способ обойти это? Спасибо!

1 Ответ

2 голосов
/ 07 апреля 2019

mode довольно сложно, учитывая, что на самом деле нет никакого согласованного способа справиться со связями.Плюс это обычно очень медленно.Вот один из способов, который будет «быстрым».Мы определим функцию, которая вычисляет режим для каждой группы, затем мы можем заполнить пропущенные значения потом map.Мы не сталкиваемся с проблемами с отсутствующими группами, хотя для связей мы произвольно выбираем модальное значение, которое стоит первым при сортировке:

def fast_mode(df, key_cols, value_col):
    """ 
    Calculate a column mode, by group, ignoring null values. 

    Parameters
    ----------
    df : pandas.DataFrame
        DataFrame over which to calcualate the mode. 
    key_cols : list of str
        Columns to groupby for calculation of mode.
    value_col : str
        Column for which to calculate the mode. 

    Return
    ------ 
    pandas.DataFrame
        One row for the mode of value_col per key_cols group. If ties, 
        returns the one which is sorted first. 
    """
    return (df.groupby(key_cols + [value_col]).size() 
              .to_frame('counts').reset_index() 
              .sort_values('counts', ascending=False) 
              .drop_duplicates(subset=key_cols)).drop(columns='counts')

Пример данных df:

   CIK  SIK
0    C  2.0
1    C  1.0
2    B  NaN
3    B  3.0
4    A  NaN
5    A  3.0
6    C  NaN
7    B  NaN
8    C  1.0
9    A  2.0
10   D  NaN
11   D  NaN
12   D  NaN

Код:

df.loc[df.SIK.isnull(), 'SIK'] = df.CIK.map(fast_mode(df, ['CIK'], 'SIK').set_index('CIK').SIK)

Выход df:

   CIK  SIK
0    C  2.0
1    C  1.0
2    B  3.0
3    B  3.0
4    A  2.0
5    A  3.0
6    C  1.0
7    B  3.0
8    C  1.0
9    A  2.0
10   D  NaN
11   D  NaN
12   D  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...