用fancyimpute和pandas进行数据估算

Rac*_*hel 14 python python-3.x pandas imputation fancyimpute

我有一个大熊猫数据成名df.它有很多缺失.丢弃行/或逐行不是一种选择.输入中位数,平均值或最常见的值也不是一种选择(因此,插入pandas和/或scikit不幸的是没有做到这一点).

我遇到了一个看起来很整洁的包fancyimpute(你可以在这里找到它).但我有一些问题.

这是我做的:

#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))
Run Code Online (Sandbox Code Playgroud)

但是,它df_filled是一个单一的向量,而不是填充的数据帧.如何通过插补来保持数据框?

更新

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

# 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))
Run Code Online (Sandbox Code Playgroud)

输出是一个数据框,其中列标签丢失.有没有办法检索标签?

Mir*_*ber 6

在代码后添加以下行:

df_filled.columns = df_numeric.columns
df_filled.index = df_numeric.index
Run Code Online (Sandbox Code Playgroud)


小智 5

我看到了花哨的impute和pandas的挫败感。这是一个使用递归覆盖方法的相当基本的包装器。接收并输出一个数据框 - 列名完好无损。这些类型的包装器与管道配合得很好。

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)

Run Code Online (Sandbox Code Playgroud)


Nic*_*zko 2

df=pd.DataFrame(data=mice.complete(d), columns=d.columns, index=d.index)
Run Code Online (Sandbox Code Playgroud)

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