【问题标题】:When i convert my numpy array to Dataframe it update values to Nan当我将我的 numpy 数组转换为 Dataframe 时,它​​会将值更新为 Nan
【发布时间】:2019-06-08 09:13:12
【问题描述】:
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

【问题讨论】:

    标签: python python-3.x machine-learning imputation


    【解决方案1】:

    已编辑

    解决方案优先

    不用将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 参数指定您要使用原始数据框中的哪些列。

    不会重新标记数据框。这并不奇怪,就像pandasreindexing 中的意图一样

    默认情况下,新索引中在数据框中没有对应记录的值被分配为 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.columns 并使用结果将列名存储在名为“columns”的列表中
    • 是的,是的,很抱歉,我不知道,我的错
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:
      Data = pd.DataFrame(data = np.array(imp.em(Data)),columns = columns)
      

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

      【讨论】:

        猜你喜欢
        • 2017-08-10
        • 2020-01-10
        • 2019-08-04
        • 2020-02-10
        • 2020-06-13
        • 2019-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多