Pandas fillna 函数未按预期运行

Pandas fillna function not behaving as expected

我正在研究 Titanic Challenge 并尝试根据该标题的年龄中位数来估算年龄列。例如,大师称号的平均年龄为 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)

上面的代码打印 title master 的年龄,包括推定的年龄。但是,当将 df_1 作为一个整体打印时,缺失值再次出现。意思是:插补没有影响内存中的df_1。

本质上,您并不是在整个数据帧 (df_1) 中应用 .fillna(),而是在您应用

时应用在它的切片上
df_1.Age[<filter condition>].fillna(..., inplace=True)

所以这创建了一个临时 Series 对象并在其上应用了 .fillna() 方法,而不是在 df_1 上应用。您可以在 FULL(不是切片)DataFrame or Series 上执行 .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