python-3.x 使用其他列中的信息填充数据集中的缺失值

q3qa4bjr  于 2023-01-27  发布在  Python
关注(0)|答案(1)|浏览(113)

我在python pandas中有一个数据集,其中变量Engine_model的值缺失,但是我还有其他行具有相同的信息。
汽车_型号发动机_型号
宝马5 A型雷诺21 B型宝马5 NaN现代桑特罗C型
例如,在这里我有一个NaN,应该用'类型A'填充,因为该信息在第一行。我该怎么做?找到信息来填充NaN,知道它的发动机型号对于同一型号的所有汽车都是相同的?
我已获得缺失值的索引和缺失值的车型名称:
发动机模型缺失索引=数据[数据['发动机模型'].isnull()].索引
汽车 * 型号 *_缺失=数据.loc[发动机_型号_缺失 * 索引,'汽车_型号 *']

r1zk6ea1

r1zk6ea11#

我发现了一个similar solution,它指的是计算一个平均值来插补缺失值,基于此,一个工作解决方案可能是这样的:

import numpy as np
import pandas as pd
from sklearn.impute import SimpleImputer
import scipy
from sklearn.base import BaseEstimator, TransformerMixin

example_df = pd.DataFrame({
    'Car_model': ['BMW 5', 'Renault 21', 'BMW 5', 'Hyunday Santro'],
    'Engine_Model': ['type A', 'type B', np.NaN, 'type C']
})

class WithinGroupModeImputer(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 == 'object':
                X_.loc[(X[col].isna()) & X_[self.group_var].notna(), col] = X_[self.group_var].map(
                    X_.groupby(self.group_var)[col].agg(lambda x: scipy.stats.mode(x, keepdims=False)[0]))
                X_[col] = X_[col].fillna(X_[col].agg(
                    lambda x: scipy.stats.mode(x, keepdims=False)[0]))
        return X_

imp = WithinGroupModeImputer(group_var='Car_model')
imp.fit(example_df)
imp.transform(example_df)

输出结果为:
| | 车型|发动机_型号|
| - ------|- ------|- ------|
| 无|宝马5|A型|
| 1个|雷诺21|B型|
| 第二章|宝马5|A型|
| 三个|现代·桑特罗|C型|

相关问题