#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
это только буква likeA
. Поэтомуlen(row)>5
всегда False, и ваш код ничего не делает.3. На самом деле да, когда я печатаю столбец, все, что я получаю, это названия стран, такие как Аргентина, Турция и т. Д. Я думал, что он напечатает все строки в столбце. В чем причина этого и как я могу исправить эту проблему в этом цикле?
Ответ №1:
Вы можете либо перебирать столбцы, либо использовать DataFrame.transform
или DataFrame.apply
.
Какой бы подход вы ни использовали, вы захотите:
- Преобразование значений столбцов из строк в значения с плавающей запятой
- Вычислите среднее значение столбца
- Используется
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 .