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))
因此,它返回从矩阵重建的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
参数指定要使用原始数据帧中的哪一列。
它不会重新标记数据帧。这并不奇怪,只是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 数组。