首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用fancyimpute和pandas进行数据填充

用fancyimpute和pandas进行数据填充
EN

Stack Overflow用户
提问于 2017-07-21 21:42:24
回答 4查看 22K关注 0票数 16

我有一个大熊猫的数据成名df。它有相当多的遗漏。删除row/或col不是一种选择。中位数、均值或最频繁的值也不是一个选项(因此,不幸的是,用pandas和/或scikit来估算并不能解决这个问题)。

我偶然发现了一个看起来很不错的包,叫做fancyimpute (你可以在here上找到它)。但是我对它有一些问题。

下面是我要做的:

代码语言:javascript
复制
#the neccesary imports
import pandas as pd
import numpy as np
from fancyimpute import KNN

# df is my data frame with the missings. I keep only floats
df_numeric = = df.select_dtypes(include=[np.float])

# I now run fancyimpute KNN, 
# it returns a np.array which I store as a pandas dataframe
df_filled = pd.DataFrame(KNN(3).complete(df_numeric))

然而,df_filled在某种程度上是一个单一的向量,而不是填充的数据帧。如何获得带有估算的数据帧?

更新

我意识到,fancyimpute需要一个numpay array。因此,我使用as_matrix()df_numeric转换为一个数组。

代码语言:javascript
复制
# df is my data frame with the missings. I keep only floats
df_numeric = df.select_dtypes(include=[np.float]).as_matrix()

# I now run fancyimpute KNN, 
# it returns a np.array which I store as a pandas dataframe
df_filled = pd.DataFrame(KNN(3).complete(df_numeric))

输出是一个缺少列标签的数据帧。有没有办法检索标签?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-03-30 01:38:45

代码语言:javascript
复制
df=pd.DataFrame(data=mice.complete(d), columns=d.columns, index=d.index)

fancyimpute对象(无论是mice还是KNN)的.complete()方法返回的np.array被作为pandas数据帧的内容(argument data=)提供,该数据帧的参数和索引与原始数据帧相同。

票数 2
EN

Stack Overflow用户

发布于 2017-07-21 22:17:43

在代码后面添加以下行:

代码语言:javascript
复制
df_filled.columns = df_numeric.columns
df_filled.index = df_numeric.index
票数 7
EN

Stack Overflow用户

发布于 2019-02-04 06:23:08

我看到了花哨的指责和熊猫的挫败感。下面是一个使用递归覆盖方法的相当基本的包装器。接收并输出数据帧-列名保持不变。这些类型的包装器可以很好地与管道一起工作。

代码语言:javascript
复制
from fancyimpute import SoftImpute

class SoftImputeDf(SoftImpute):
    """DataFrame Wrapper around SoftImpute"""

    def __init__(self, shrinkage_value=None, convergence_threshold=0.001,
                 max_iters=100,max_rank=None,n_power_iterations=1,init_fill_method="zero",
                 min_value=None,max_value=None,normalizer=None,verbose=True):

        super(SoftImputeDf, self).__init__(shrinkage_value=shrinkage_value, 
                                           convergence_threshold=convergence_threshold,
                                           max_iters=max_iters,max_rank=max_rank,
                                           n_power_iterations=n_power_iterations,
                                           init_fill_method=init_fill_method,
                                           min_value=min_value,max_value=max_value,
                                           normalizer=normalizer,verbose=False)



    def fit_transform(self, X, y=None):

        assert isinstance(X, pd.DataFrame), "Must be pandas dframe"

        for col in X.columns:
            if X[col].isnull().sum() < 10:
                X[col].fillna(0.0, inplace=True)

        z = super(SoftImputeDf, self).fit_transform(X.values)
        return pd.DataFrame(z, index=X.index, columns=X.columns)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45239256

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档