在函数中调用列与在 pandas 数据帧中调用外部的列有何不同?


df=pd.DataFrame({"Age":[11,12,14,15,np.NaN,np.NaN],"Class":[10,11,10,11,9,9]})
df
def impute_age(cols):
Age = cols[0]
Class = cols[1]
if np.isnan(Age):
if Class == 10:
return 11
elif Class == 11:
return 12
else:
return 9
else:
return Age
df.apply(impute_age,axis=1)

在这个impute_age函数中,它将第一行称为 cols[0],但是如果我们使用 cols[0] 调用函数外部数据帧的列,它将显示错误,因为我们必须指定列名。为什么?

如果选中print(cols)它会像系列一样返回数据帧的每一行,所以如果要按位置选择,请使用iat

def impute_age(cols):
print (cols)
Age = cols.iat[0]
Class = cols.iat[1]
if np.isnan(Age):
if Class == 10:
return 11
elif Class == 11:
return 12
else:
return 9
else:
return Age

或按列名选择:

def impute_age(cols):
print (cols)
Age = cols['Age']
Class = cols['Class']
if np.isnan(Age):
if Class == 10:
return 11
elif Class == 11:
return 12
else:
return 9
else:
return Age

df = df.apply(impute_age,axis=1)

来自 DataFrame.apply 文档:

传递给函数的对象是系列对象 [...]

这意味着传递给impute_age的是一个系列,而不是完整的数据帧。 即该函数不应用于df,而是应用于df.loc[i](对于每个可能的 i(: 如果打印df.loc[0][0],将获得第一行的Age值。

相关内容

最新更新