如何在pandas中使用用户函数fillna()

时间:2016-09-14 00:55:45

标签: python pandas

这是我拥有的数据帧的一个片段:

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))

但当然它不起作用,我不知道如何告诉我喜欢与该特定行中的标题对应的值的函数。

如何执行此操作?

2 个答案:

答案 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.