【问题标题】:Pandas fillna function not behaving as expectedPandas fillna 功能未按预期运行
【发布时间】:2020-11-15 16:11:45
【问题描述】:

我正在处理Titanic Challenge 并尝试根据该标题的年龄中位数来估算年龄列。例如,职称 Master 的中位年龄为 3.5。对于标题等于 Master 并且缺少年龄的所有行,我们将估算为 3.5。以下是我的代码:

import pandas as pd

df = pd.read_csv('train.csv', index_col=0)

df_1 = df.copy()

df_1.Age[df_1.Name.str.contains('master', case= False)].fillna(df.Age[df.Name.str.contains('master', case=False)].median(), inplace = True)

上面的代码会打印标题主人的年龄,包括那些估算的。但是,当整体打印 df_1 时,缺失值会再次出现。含义:插补不影响内存中的df_1。

【问题讨论】:

  • 经过反复试验后,我以这种方式对其进行了修复:df_3.Age[df_3.Name.str.contains('master', case= False)] = df_3.Age[df_3.Name. str.contains('master', case= False)].fillna(df_2.Age[df_2.Name.str.contains('master', case=False)].median(), inplace = False) 以下错误是返回:试图在 DataFrame 中的切片副本上设置一个值。这会造成问题吗?

标签: pandas fillna


【解决方案1】:

基本上,您不是在整个数据帧 (df_1) 中应用 .fillna(),而是在应用时应用在它的切片上

df_1.Age[<filter condition>].fillna(..., inplace=True)

因此,这创建了一个临时的 Series 对象并在其上应用了 .fillna() 方法,而不是在 df_1 上。您可以在 FULL(不是切片)DataFrameSeries 上执行 .fillna() 以查看 inplace=True 对原始数据帧的影响。你想要的输出可以通过这个来实现。

import pandas as pd

df = pd.read_csv('train.csv', index_col=0)

df_1 = df.copy()

median = df.Age[df.Name.str.contains('master', case=False)].median()

# find the missing age of row containing "master" (case-insensitive) in "Name" 
# and replace with the median age
condition = (df_1.Name.str.contains('master', case=False) & df_1.Age.isna())
df_1.loc[condition, "Age"] = median

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-02
    • 2020-07-10
    • 1970-01-01
    • 2013-08-29
    • 2020-04-28
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多