Editted
Решение первое
Вместо передачи columns
в pd.DataFrame
, просто присвойте имена столбцов вручную:
data = pd.DataFrame(imp.em(data))
data.columns = columns
Причина
Ошибка заключается в Data = pd.DataFrame(data = imp.em(Data),columns = columns)
.
imp.em
имеет декоратор @preprocess
, который преобразует входные данные в numpy.array
, если это pandas.DataFrame
.
...
if pd_DataFrame and isinstance(args[0], pd_DataFrame):
args[0] = args[0].as_matrix()
return pd_DataFrame(fn(*args, **kwargs))
Поэтому он возвращает dataframe
, восстановленный из матрицы, с range(data.shape[1])
в качестве имен столбцов.
И, как я указал ниже, когда pd.DataFrame
создается с несоответствием columns
для другого pd.DataFrame
, все содержимое становится NaN
.
Вы можете проверить это
from impyute.util import preprocess
@preprocess
def test(data):
return data
data = pd.DataFrame({"time": [1,2,3], "size": [3,2,1]})
columns = data.columns
data = pd.DataFrame(test(data), columns = columns))
size time
0 NaN NaN
1 NaN NaN
2 NaN NaN
Когда вы создаете экземпляр pd.DataFrame
из существующего аргумента pd.DataFrame
, columns
указывает, какой из столбцов исходного кадра данных вы хотите использовать.
Он не перемаркирует кадр данных. Что не странно, просто способ pandas
предназначен для переиндексации
По умолчанию значениям в новом индексе, которые не имеют соответствующих записей в кадре данных, присваивается значение NaN.
# Make new pseudo dataset
data = pd.DataFrame({"time": [1,2,3], "size": [3,2,1]})
data
size time
0 3 1
1 2 2
2 1 3
#Make new dataset with original `data`
data = pd.DataFrame(data, columns = ["a", "b"])
data
a b
0 NaN NaN
1 NaN NaN
2 NaN NaN