这是我拥有的数据帧的一个片段:
Title | Age
------+--------
Mr. | 30
Mr. | NaN
Mr. | 32
Mrs. | 28
Mrs. | 16
Mr. | 34
Mrs. | NaN
编辑:我添加了最后一行,以澄清问题
我想要归纳NaNs(第二行和最后一行),对于第二行,它应该使用另一行的平均值" Mr。"在数据框中,所以在这种情况下,应该是32,在最后一行它应该使用另一个" Mrs."的平均值,所以应该是22
计算平均值就像做
一样简单value = df.loc[df["Title"] == "Mr."]["Age"].mean()
所以我写了一个名为agefun的函数:
def agefun(df, t):
return df.loc[df["Title"] == t]["Age"].mean()
现在,它如何工作,如何在fillna()函数中使用此函数?我喜欢这样的事情:
df['Age'].fillna(agefun(df, this_row_title))
但当然它不起作用,我不知道如何告诉我喜欢与该特定行中的标题对应的值的函数。
如何执行此操作?
答案 0 :(得分:2)
Transform与数据框中的原始系列保持相同的形状。
df['Age'] = df.groupby('Title').transform(lambda group: group.fillna(group.mean()))
>>> df
Title Age
0 Mr. 30
1 Mr. 32 # (30 + 32 + 34) / 3 = 32
2 Mr. 32
3 Mrs. 28
4 Mrs. 16
5 Mr. 34
在上面的示例中,它保持所有值不变,除了第二行上的一个NaN
值,它通过计算组的平均值来填充,即{的所有行的平均值。 {1}}是Title
。
答案 1 :(得分:0)
你也可以这样做:
df['Age'] = df['Age'].fillna(df.loc[df['Title'] == 'Mr.', 'Age'].mean())
df
输出:
Age Title
0 30.0 Mr.
1 32.0 Mr.
2 32.0 Mr.
3 28.0 Mrs.
4 16.0 Mrs.
5 34.0 Mr.