当我将我的 numpy 数组转换为数据帧时,它会将值更新为 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

已编辑

解决方案优先

无需将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))

因此,它返回从矩阵重建的dataframerange(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参数指定要使用原始数据帧中的哪一列。

不会重新标记数据帧。这并不奇怪,只是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

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

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新