带groupby的simplemputer

2024-09-30 22:21:04 发布

您现在位置:Python中文网/ 问答频道 /正文

让我们假设以下数据集

^{tb1}$

考虑到category列,我想用SimpleImputer进行插补

也就是说,考虑到产品的category,我想分配平均值 如果产品没有类别,那么,我想考虑没有{{CD1}}的产品的平均值。

所以,要完成code01的糖。 我只考虑了{{CD1>} b

的产品的所有^ {CD5>}。
^{tb2}$

我做了类似的事情,如下所示。但是我需要使用SimpleComputer来完成它
为了澄清,在下面的例子中,我在没有category的情况下用列的平均值完成了NaN

for col in df.columns:
    if df[col].dtypes == "float64":
        df.loc[df[col].isna() & df["category"].notnull(), col] = df["categories"].map(df.groupby("category")[col].mean())
        df[col].fillna(df[col].mean(), inplace=True)

Tags: 数据df产品colmean类别事情平均值
1条回答
网友
1楼 · 发布于 2024-09-30 22:21:04

恐怕你不能只用SimpleImputer来解决这类问题(至少据我所知)

但是,您可以使用scikit learn非常灵活的类BaseEstimatorTransformerMixin创建一个自定义的插补器类

一个非常基本的类如下所示:

from sklearn.base import BaseEstimator, TransformerMixin

class WithinGroupMeanImputer(BaseEstimator, TransformerMixin):
    def __init__(self, group_var):
        self.group_var = group_var
    
    def fit(self, X, y=None):
        return self
        
    def transform(self, X):
        # the copy leaves the original dataframe intact
        X_ = X.copy()
        for col in X_.columns:
            if X_[col].dtypes == 'float64':
                X_.loc[(X[col].isna()) & X_[self.group_var].notna(), col] = X_[self.group_var].map(X_.groupby(self.group_var)[col].mean())
                X_[col] = X_[col].fillna(X_[col].mean())
        return X_

在示例数据集上:

imp = WithinGroupMeanImputer(group_var='category')

imp.fit(df)

imp.transform(df)

   code category       energy     sugars  proteins
0    01        B   936.000000  20.000000  7.800000
1    02     None  1127.848485  15.000000  4.881818
2    03        A  1569.000000  23.000000  4.100000
3    04     None   826.000000  20.916667  3.000000
4    05        B  1345.000000  22.000000  5.100000
5    06        A  1569.000000  17.000000  4.100000
6    10        C   826.000000  26.000000  3.000000
7    11        C  1345.000000  26.000000  5.100000
8   101        B   972.333333  18.000000  6.100000
9   102        B   636.000000  20.000000  7.800000
10  103     None  1127.848485  15.000000  4.881818
11  104        A  1569.000000  23.000000  4.100000
12  105        C   813.000000  26.000000  3.500000

原始数据:

import pandas as pd

df = pd.DataFrame({
    'code': ['01', '02', '03', '04', '05', '06', '10', '11', '101', '102', '103', '104', '105'],
    'category': ['B', None, 'A', None, 'B', 'A', 'C', 'C', 'B', 'B', None, 'A', 'C'],
    'energy': [936, None, 1569, 826, 1345, None, 826, 1345, None, 636, None, 1569, 813],
    'sugars': [None, 15, 23, None, 22, 17, None, 26, 18, None, 15, 23, None],
    'proteins': [7.8, None, 4.1, 3, 5.1, None, 3, 5.1, 6.1, 7.8, None, 4.1, 3.5]
})

相关问题 更多 >