Заполнение нулевых значений средним значением

Мне дан набор данных со многими значениями NaN, и я хотел заполнить нулевое значение средним значением каждого столбца. Итак, я попробовал следующий код:

def fill_mean():  
    m = [df.columns.get_loc(c) for c in df.columns if c in missing]
    for i in m:
        df[df.columns[i]] =df[df.columns[i]].fillna(value=df[df.columns[i]].mean())
    return df

но я получаю эту ошибку:

TypeError: must be str, not int

Все столбцы, которые я пытаюсь заполнить, состоят из одного и того же типа: либо 'float64', либо 'O'.
Я подозреваю, что проблема возникает из-за этого факта, но как я могу ее решить?


Изменить: я создал словарь, содержащий столбец, который содержит индекс столбцов, в которых отсутствуют некоторые данные, и тип каждого столбца.

di = dict(zip(missing, m2)) 
def fill_mean():
    m = [df.columns.get_loc(c) for c in df.columns if c in missing]
    for i in m:
        if di[m] == "dtype('float64')":
            df[df.columns[i]] = df[df.columns[i]].fillna(value=df[df.columns[i]].mean())
    return df

Если я запускаю fill_mean(), теперь я получаю другую ошибку:

    if di[m] == "dtype('float64')":

TypeError: unhashable type: 'list'

person plastico    schedule 27.04.2018    source источник
comment
Что, если бы я хотел сделать это через итерацию?   -  person plastico    schedule 27.04.2018
comment
Можете ли вы предоставить некоторые образцы данных?   -  person Scott Boston    schedule 27.04.2018


Ответы (1)


Я думаю, вы хотите сначала привести свои столбцы к типу float, а затем использовать df.fillna, используя df.mean() в качестве аргумента value:

df[["columns", "to", "change"]] = df[["columns", "to", "change"]].astype('float')

df.fillna(df.mean())

Примечание. Если все ваши столбцы в вашем фрейме данных могут быть преобразованы в float, вы можете просто сделать:

df = df.astype('float').fillna(df.astype('float').mean())

Пример:

df = pd.DataFrame({'col1':np.random.choice([np.nan, '1','2'], 10), 
     'col2':np.random.choice([np.nan, '1', '2'], 10)})


>>> print(df)
  col1 col2
0    2    1
1    2    1
2  nan  nan
3    1    2
4    1    2
5  nan    2
6    2    2
7    2    2
8    1    2
9  nan    1

df[['col1', 'col2']] = df[['col1', 'col2']].astype('float')

df = df.fillna(df.mean())


>>> print(df)
       col1      col2
0  2.000000  1.000000
1  2.000000  1.000000
2  1.571429  1.666667
3  1.000000  2.000000
4  1.000000  2.000000
5  1.571429  2.000000
6  2.000000  2.000000
7  2.000000  2.000000
8  1.000000  2.000000
9  1.571429  1.000000
person sacuL    schedule 27.04.2018