当我将 numpy 数组转换为 Dataframe 时,它​​会将值更新为 Nan

When i convert my numpy array to Dataframe it update values to Nan

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

之后

     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

impyute 库中可能存在一些错误。您正在使用 em 函数,它不过是通过 expectation-maximization 算法获得 fill-missing 值的一种方法。您可以尝试不使用该功能,因为

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

您可以在确认后提出此问题here。要确认首先加载数据,请使用上面的示例并使用 df.isnull() 方法查找数据中是否存在空数据。

已编辑

先解决

不是将 columns 传递给 pd.DataFrame,而是手动分配列名:

data = pd.DataFrame(imp.em(data))
data.columns = columns

原因

错误在Data = pd.DataFrame(data = imp.em(Data),columns = columns).

imp.em 有一个装饰器 @preprocess,如果它是 pandas.DataFrame.

,它会将输入转换为 numpy.array
...
if pd_DataFrame and isinstance(args[0], pd_DataFrame):
    args[0] = args[0].as_matrix()
    return pd_DataFrame(fn(*args, **kwargs))

它因此 returns 从矩阵重建的 dataframe,具有 range(data.shape[1]) 作为列名。

正如我在下面指出的那样,当 pd.DataFrame 在另一个 pd.DataFrame 上用 不匹配 columns 实例化时,所有内容都变成 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 参数指定您要使用原始数据框中的哪些列。

不会重新标记数据帧。这并不奇怪,正是 pandasreindexing

中的意图

By default values in the new index that do not have corresponding records in the dataframe are assigned 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
Data = pd.DataFrame(data = np.array(imp.em(Data)),columns = columns)

这样做解决了我面临的问题,我想使用 em 函数后的数据不会 return numpy 数组。