【问题标题】:filling mean age according the class of the Student [duplicate]根据学生的班级填写平均年龄[重复]
【发布时间】:2022-02-02 11:27:20
【问题描述】:

我有一个df,有来自三个不同班级的学生。我正在尝试根据同班其他学生的平均年龄来填补缺失的年龄。我尝试了两种不同的方法。一个正在工作,另一个没有。我无法弄清楚为什么会这样,因为我觉得两种方式都在做同样的事情。您能否解释一下为什么解决方案 B 不起作用而 A 起作用?

解决方案 A:(工作)

df.loc[(df['Age'].isna()) & (df['Class'] == 1),'Age'] = mean_age

解决方案 B:(不工作)

df.loc[df['Class'] == 1,'Age'].fillna(mean_age, inplace=True)

【问题讨论】:

  • 能否展示您的数据框样本?

标签: python pandas dataframe


【解决方案1】:

IIUC:

df['Age'] = df['Age'].fillna(df.groupby('Class')['Age'].transform('mean'))

解决方案 B 无法工作,因为您对数据框进行了切片,因此您创建了一个“副本”并就地填充了 nan 值。副本已填充,但未填充原始数据框。

【讨论】:

    【解决方案2】:

    当您调用 loc 时,您正在对 DataFrame 进行切片以返回它的副本,并且由于 inplace=True 对应用它的对象起作用,因此副本确实发生了更改,但原始 DataFrame 保持不变。如果你改变了

    df.loc[df['Class'] == 1,'Age'].fillna(mean_age, inplace=True)
    

    df.loc[df['Class'] == 1,'Age'] = df.loc[df['Class'] == 1,'Age'].fillna(mean_age)
    

    或(如@Corralien的回答)

    df['Age'].fillna(df.groupby('Class')['Age'].transform('mean'), inplace=True)
    

    然后它将按预期工作,因为在这些情况下,原始 DataFrame 列已更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多