import impyute.imputation.cs as impprint(Data)Data = pd.DataFrame(data = imp.em(Data),columns = columns)print(Data)
当我执行上述代码时,所有的值都被转换为NaN,如下所示,有人能帮我指出我哪里做错了嗎?
转换前
Time LymphNodeStatus ... MeanPerimeter TumorSize0 31 5.0 ... 117.50 5.01 61 2.0 ... 122.80 3.02 116 0.0 ... 137.50 2.53 123 0.0 ... 77.58 2.04 27 0.0 ... 135.10 3.55 77 0.0 ... 84.60 2.5
转换后
Time LymphNodeStatus ... MeanPerimeter TumorSize0 NaN NaN ... NaN NaN1 NaN NaN ... NaN NaN2 NaN NaN ... NaN NaN3 NaN NaN ... NaN NaN4 NaN NaN ... NaN NaN5 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))
因此,它返回了一个从矩阵重建的dataframe
,其列名是range(data.shape[1])
。
正如我在下面指出的那样,当pd.DataFrame
在另一个pd.DataFrame
上以不匹配的columns
实例化时,所有的内容都会变成NaN
。
你可以通过以下方式测试这一点:
from impyute.util import preprocess@preprocessdef test(data): return datadata = pd.DataFrame({"time": [1,2,3], "size": [3,2,1]})columns = data.columnsdata = pd.DataFrame(test(data), columns = columns))size time0 NaN NaN1 NaN NaN2 NaN NaN
当你从一个现有的pd.DataFrame
实例化一个pd.DataFrame
时,columns
参数指定了你想使用原始数据框中的哪些列。
它不会重新标记数据框。这并不奇怪,只是pandas
在重新索引中的设计方式
默认情况下,新索引中没有对应记录的数据框值会被赋值为NaN。
# 创建新的伪数据集data = pd.DataFrame({"time": [1,2,3], "size": [3,2,1]})data size time0 3 11 2 22 1 3# 使用原始的`data`创建新的数据集data = pd.DataFrame(data, columns = ["a", "b"])dataa b0 NaN NaN1 NaN NaN2 NaN NaN