Pandas DataFrame: замените значения nan на среднее значение столбцов
У меня есть фрейм данных pandas, заполненный в основном реальными числами, но есть несколько nan
значения в нем.
Как я могу заменить nan
s со средними столбцами, где они находятся?
этот вопрос очень похож на этот: массив numpy: замените значения nan на среднее значение столбцов но, к сожалению, решение, данное там, не работает для фрейма данных pandas.
7 ответов:
вы можете просто использовать
DataFrame.fillna
заполнитьnan
's непосредственно:In [27]: df Out[27]: A B C 0 -0.166919 0.979728 -0.632955 1 -0.297953 -0.912674 -1.365463 2 -0.120211 -0.540679 -0.680481 3 NaN -2.027325 1.533582 4 NaN NaN 0.461821 5 -0.788073 NaN NaN 6 -0.916080 -0.612343 NaN 7 -0.887858 1.033826 NaN 8 1.948430 1.025011 -2.982224 9 0.019698 -0.795876 -0.046431 In [28]: df.mean() Out[28]: A -0.151121 B -0.231291 C -0.530307 dtype: float64 In [29]: df.fillna(df.mean()) Out[29]: A B C 0 -0.166919 0.979728 -0.632955 1 -0.297953 -0.912674 -1.365463 2 -0.120211 -0.540679 -0.680481 3 -0.151121 -2.027325 1.533582 4 -0.151121 -0.231291 0.461821 5 -0.788073 -0.231291 -0.530307 6 -0.916080 -0.612343 -0.530307 7 -0.887858 1.033826 -0.530307 8 1.948430 1.025011 -2.982224 9 0.019698 -0.795876 -0.046431
строка документа
fillna
говорит, чтоvalue
должен быть скаляр или дикт, однако, похоже, он работает сSeries
как хорошо. Если вы хотите передать дикт, вы можете использоватьdf.mean().to_dict()
.
In [16]: df = DataFrame(np.random.randn(10,3)) In [17]: df.iloc[3:5,0] = np.nan In [18]: df.iloc[4:6,1] = np.nan In [19]: df.iloc[5:8,2] = np.nan In [20]: df Out[20]: 0 1 2 0 1.148272 0.227366 -2.368136 1 -0.820823 1.071471 -0.784713 2 0.157913 0.602857 0.665034 3 NaN -0.985188 -0.324136 4 NaN NaN 0.238512 5 0.769657 NaN NaN 6 0.141951 0.326064 NaN 7 -1.694475 -0.523440 NaN 8 0.352556 -0.551487 -1.639298 9 -2.067324 -0.492617 -1.675794 In [22]: df.mean() Out[22]: 0 -0.251534 1 -0.040622 2 -0.841219 dtype: float64
применить на столбец среднее значение этого столбца и заполнить
In [23]: df.apply(lambda x: x.fillna(x.mean()),axis=0) Out[23]: 0 1 2 0 1.148272 0.227366 -2.368136 1 -0.820823 1.071471 -0.784713 2 0.157913 0.602857 0.665034 3 -0.251534 -0.985188 -0.324136 4 -0.251534 -0.040622 0.238512 5 0.769657 -0.040622 -0.841219 6 0.141951 0.326064 -0.841219 7 -1.694475 -0.523440 -0.841219 8 0.352556 -0.551487 -1.639298 9 -2.067324 -0.492617 -1.675794
# To read data from csv file Dataset = pd.read_csv('Data.csv') # To divide input in X and y axis X = Dataset.iloc[:, :-1].values Y = Dataset.iloc[:, 3].values # To calculate mean use imputer class from sklearn.preprocessing import Imputer imputer = Imputer(missing_values='NaN', strategy='mean', axis=0) imputer = imputer.fit(X[:, 1:3]) X[:, 1:3] = imputer.transform(X[:, 1:3])
еще один вариант помимо вышеперечисленных:
df = df.groupby(df.columns, axis = 1).transform(lambda x: x.fillna(x.mean()))
это менее элегантно, чем предыдущие ответы для среднего, но это может быть короче, если вы хотите заменить нули на какую-то другую функцию столбца.
Если вы хотите вменить пропущенные значения со средним значением, и вы хотите идти столбец за столбцом, то это будет только вменять со средним значением этого столбца. Это может быть немного более читаемым.
sub2['income'] = sub2['income'].fillna((sub2['income'].mean()))
использовать
df.fillna(df.mean())
чтобы заполнить все нулевое значение со среднимесли вы хотите заполнить нулевое значение со средним значением этого столбца, то вы можете использовать это
предположим
x=df['Item_Weight']
здесьItem_Weight
- имя столбцаздесь мы присваиваем (заполняем нулевые значения x со средним значением x в x)
df['Item_Weight'] = df['Item_Weight'].fillna((df['Item_Weight'].mean()))
если вы хотите заполнить нулевое значение с некоторой строкой, то используйте
здесь
Outlet_size
- имя столбцаdf.Outlet_Size = df.Outlet_Size.fillna('Missing')