【问题标题】:How do I merge my imputed data with my original dataframe?如何将我的推算数据与我的原始数据框合并?
【发布时间】:2021-02-07 18:16:51
【问题描述】:

我正在解决泰坦尼克号 kaggle 问题,我想做的一件事是使用 sklearn 的 IterativeImputer 来填充我的缺失值。

在运行插补并生成“填充”值后,我遇到了障碍。我想知道如何最好地使用填充值更新原始数据框。

代码:

from sklearn.experimental import enable_iterative_imputer  
from sklearn.impute import IterativeImputer

from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np

titanic = pd.DataFrame(
    {
     "PassengerId": [1, 2, 3, 4, 5],
     "Survived": [0, 1, 1, 1, 0],
     "PClass": ['3', '1', '3', '1', '3'],
     "Name": ['Braund, Mr. Owen Harris', 'Cumings, Mrs. John Bradley (Florence Briggs Thayer)',
              'Heikkinen, Miss. Laina', 'Futrelle, Mrs. Jacques Heath (Lily May Peel)', 'Allen, Mr. William Henry'],
     "Sex": ['male', 'female', 'female', 'female', 'male'],
     "Age": [22, 38, 26, np.nan, 35],
     "SibSp": [1, 1, 0, 1, 0],
     "Parch": [0, 0, 0, 0, 0],
     "Fare": [7.25, 71.2833, 7.925, 53.1, 8.05]
     }
    )

# Slicing dataframe to feed to imputer
titanic_sliced = titanic.loc[:, ['Age', 'SibSp', 'Parch', 'Fare']]
titanic_sliced.head()

切片数据集的输出:

        Age  SibSp  Parch     Fare
0  22.0      1      0   7.2500
1  38.0      1      0  71.2833
2  26.0      0      0   7.9250
3   NaN      1      0  53.1000
4  35.0      0      0   8.0500

使用随机森林估计器运行 imputer

imp = IterativeImputer(RandomForestRegressor(), max_iter=10, random_state=0)
imputed_titanic = pd.DataFrame(imp.fit_transform(titanic_sliced), columns=titanic_sliced.columns)
imputed_titanic

imputed_titanic 的输出:

       Age  SibSp  Parch     Fare
0  22.00    1.0    0.0   7.2500
1  38.00    1.0    0.0  71.2833
2  26.00    0.0    0.0   7.9250
3  36.11    1.0    0.0  53.1000
4  35.00    0.0    0.0   8.0500

所以现在我的问题是,用估算值更新原始数据框的最佳方法是什么?

【问题讨论】:

  • 这不是 MRE:您发布的代码无法运行,因为您未能初始化数据框。
  • @Prune 我敢肯定你现在可能对我很生气,但再次感谢。我现在意识到我最初的要求很懒惰。实际上,我已经学到了很多东西,只是将我的问题变成了正确的格式。我运行了更新后的代码,它完全重现了我的预期。
  • 就是这样:从错误中吸取教训,下次做得更好。只要您努力改进,我们很乐意与您合作。

标签: python dataframe


【解决方案1】:

你不能,就像给定的那样。您销毁了所需位置的数据。相反,您必须以某种方式维护该数据。我建议您将索引转移到一个简单的数据列,以便以后恢复。

【讨论】:

  • 我试了一下,效果很好,但是包含索引会影响插补结果,有没有办法在不考虑插补索引列的情况下做到这一点?
  • 我们无法判断,您忽略了包含预期的MRE - Minimal, Reproducible Example。当我遇到这个问题时,我只是简单地保留原始数据框,在没有干扰数据的情况下进行插补,然后根据原始 DF 中的 other 值匹配结果。更有效的是使用足够智能的插补例程,让您指定涉及哪些列。
  • 抱歉,我认为我的原始帖子包含要复制的相关代码,但随着我变得更具体,我意识到我应该包含代码。感谢您的建议。因为我还是新手,所以我会按照你的建议做,使用其他值进行匹配。我很想达到可以实施您的后一个建议的地步,但是对于学习,我会推迟。
  • 再次检查 MRE 的建议。 Include your minimal data frame 作为示例的一部分。您的代码死了,因为没有 train.csv 文件。这个问题消失了,因为你没有展示处理的阶段。
  • 根据您分享的建议和您链接的 MRE 指南更新了问题。希望对我仍然可以对我的问题做出的改进提供任何反馈。我认识到您已经超越了这里,非常感谢您回答我的问题并帮助我了解如何在此处正确提问。
【解决方案2】:

感谢用户 Prune,我能够弄清楚这一点。我不确定这是最好的方法,但在我的例子中,解决方案非常简单。因为插补前后数据的顺序相同,所以我可以使用 combine_first 更新我的数据,同时保留其余的非缺失值。

我不认为这是理想的,因为情况并非总是如此,我想进一步开发它以使其“更智能”(即能够指定要估算的值或以某种方式包含索引/join 键)。

这是我最终使用的代码:

df3= titanic.combine_first(imputed_titanic)
df3.head()

输出:

 Age Cabin Embarked     Fare                                               Name  Parch  PassengerId  Pclass     Sex  SibSp  Survived            Ticket
0  22.0   NaN        S   7.2500                            Braund, Mr. Owen Harris      0            1       3    male      1         0         A/5 21171
1  38.0   C85        C  71.2833  Cumings, Mrs. John Bradley (Florence Briggs Th...      0            2       1  female      1         1          PC 17599
2  26.0   NaN        S   7.9250                             Heikkinen, Miss. Laina      0            3       3  female      0         1  STON/O2. 3101282
3  35.0  C123        S  53.1000       Futrelle, Mrs. Jacques Heath (Lily May Peel)      0            4       1  female      1         1            113803
4  35.0   NaN        S   8.0500                           Allen, Mr. William Henry      0            5       3    male      0         0            373450

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-16
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 2018-11-08
    • 2022-01-01
    • 2019-10-23
    • 1970-01-01
    相关资源
    最近更新 更多