Когда я преобразовываю свой массив NumPy в Dataframe, он обновляет значения в Nan - PullRequest
0 голосов
/ 14 января 2019
import impyute.imputation.cs as imp

print(Data)
Data = pd.DataFrame(data = imp.em(Data),columns = columns)
print(Data)

Когда я делаю приведенный выше код, все мои значения преобразуются в Nan, как показано ниже. Может ли кто-нибудь помочь мне, где я ошибаюсь?

До

     Time  LymphNodeStatus    ...      MeanPerimeter  TumorSize
0      31              5.0    ...             117.50        5.0
1      61              2.0    ...             122.80        3.0
2     116              0.0    ...             137.50        2.5
3     123              0.0    ...              77.58        2.0
4      27              0.0    ...             135.10        3.5
5      77              0.0    ...              84.60        2.5

* После 1007 *

     Time  LymphNodeStatus    ...      MeanPerimeter  TumorSize
0     NaN              NaN    ...                NaN        NaN
1     NaN              NaN    ...                NaN        NaN
2     NaN              NaN    ...                NaN        NaN
3     NaN              NaN    ...                NaN        NaN
4     NaN              NaN    ...                NaN        NaN
5     NaN              NaN    ...                NaN        NaN

Ответы [ 3 ]

0 голосов
/ 14 января 2019

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
0 голосов
/ 14 января 2019
Data = pd.DataFrame(data = np.array(imp.em(Data)),columns = columns)

Это решило проблему, с которой я столкнулся, я думаю, что данные после использования функции em не возвращают массив numpy.

0 голосов
/ 14 января 2019

В библиотеке impyute может быть ошибка. Вы используете функцию em, которая представляет собой не что иное, как способ fill-missing значений по алгоритму expectation-maximization. Вы можете попробовать без использования этой функции, как

df = pd.DataFrame(data = Data ,columns = columns)

Вы можете поднять этот вопрос здесь после подтверждения. Для подтверждения сначала загрузите данные, используя приведенный выше пример, и определите, есть ли в данных нулевые данные, используя метод df.isnull().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...