функция для замены нулевых значений на среднее

#pandas #dataframe

#pandas #фрейм данных

Вопрос:

У меня есть данные по безработице для 30 стран, и в них есть некоторые пропущенные значения, но в таблице Excel все эти числа являются строками, поэтому я сначала преобразую их в значения с плавающей запятой, а затем, если строка пуста, я хочу заменить строку средним значением ее столбцов. Функция работает хорошо, не возвращает никаких ошибок, но когда я печатаю данные, у меня все еще есть нулевые значения

  data=pd.read_excel(r'C:UsersOĞUZDesktopemployment.xlsx')
    data=data.set_index('Unnamed: 0')
    for column in data:
        for row in column:
            if len(row)>5:
                row=float(row)
                if row.isnull():
                    row=column.mean()
print(data['Argentina'].head())
 

Это то, что я получаю после печати.

 Unnamed: 0
1990   NaN
1991   NaN
1992   NaN
1993   NaN
1994   NaN
Name: Argentina, dtype: float64
 

Комментарии:

1. Попробуйте это: data = data.apply(lambda x: x.fillna(mean()))

2.Если вы добавляете print() после for column in data: и получаете строку, то for row in column: row это только буква like A . Поэтому len(row)>5 всегда False, и ваш код ничего не делает.

3. На самом деле да, когда я печатаю столбец, все, что я получаю, это названия стран, такие как Аргентина, Турция и т. Д. Я думал, что он напечатает все строки в столбце. В чем причина этого и как я могу исправить эту проблему в этом цикле?

Ответ №1:

Вы можете либо перебирать столбцы, либо использовать DataFrame.transform или DataFrame.apply .

Какой бы подход вы ни использовали, вы захотите:

  1. Преобразование значений столбцов из строк в значения с плавающей запятой
  2. Вычислите среднее значение столбца
  3. Используется Series.fillna для заполнения значений NaN ранее вычисленным значением

Создание данных

 import pandas as pd
import numpy as np
rng = np.random.default_rng(0)

df = pd.DataFrame({
    "a": rng.integers(5, size=10),
    "b": rng.integers(5, 10, size=10),
    "c": rng.integers(10, 15, size=10)
}).astype(str)
df.loc[2:5, :] = np.nan

# note all the numbers you see are actually strings
print(df)
     a    b    c
0    4    8   11
1    3    9   14
2  NaN  NaN  NaN
3  NaN  NaN  NaN
4  NaN  NaN  NaN
5  NaN  NaN  NaN
6    0    8   12
7    0    7   10
8    0    7   13
9    4    9   13
 

Решение — преобразование фрейма данных

 def clean_column(series):
    series = pd.to_numeric(series, downcast="float")
    avg = series.mean()
    return series.fillna(avg)

new_df = df.transform(clean_column)

print(new_df)
0  4.000000  8.0  11.000000
1  3.000000  9.0  14.000000
2  1.833333  8.0  12.166667
3  1.833333  8.0  12.166667
4  1.833333  8.0  12.166667
5  1.833333  8.0  12.166667
6  0.000000  8.0  12.000000
7  0.000000  7.0  10.000000
8  0.000000  7.0  13.000000
9  4.000000  9.0  13.000000
 

Ответ №2:

Для заполнения NAN используйте df.fillna(value) . Для среднего использования df.mean() . Если у вашего столбца есть имя Argentina , это может выглядеть следующим образом:

 df.Argentina.fillna(df.Argentina.mean(), inplace=True)
 

Это inplace=True для переназначения. Строка эквивалентна

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

Пример

 df = pd.DataFrame({'Argentina':[1,np.nan,2,4]}, index=[1990, 1991, 1992, 1993])
>>> df  
        Argentina
1990    1.0
1991    NaN
1992    2.0
1993    4.0

df.Argentina.fillna(df.Argentina.mean(), inplace=True)

>>> df
        Argentina
1990    1.000000
1991    2.333333
1992    2.000000
1993    4.000000
 

Если у вас много столбцов, и вы хотите заполнить NAN значениями, зависящими от столбца, вы можете перебирать имена столбцов, как показано ниже:

 for name in df.columns:
    df[name].fillna(df[name].mean(), inplace=True)
 

Комментарии:

1. Что делает мой код здесь неправильным?

2. Как я могу заполнить все пустые строки его столбцами со средними или средними значениями для всех строк в dataframe? Я имею в виду, как я могу сделать то, что вы сделали только для одного столбца для всего фрейма данных?

3. Если вы хотите заполнить все значения NaN во всех столбцах, вы можете использовать df.fillna(value, inplace=Ture) . Вы можете вычислить или установить значение value before .