【问题标题】:Fill NaN with mean of a group for each column [duplicate]用每列的一组平均值填充 NaN [重复]
【发布时间】:2015-12-01 00:54:12
【问题描述】:

我知道fillna() 方法可用于在整个数据帧中填充 NaN。

df.fillna(df.mean()) # fill with mean of column.

如何将均值计算限制在 NaN 所在的组(和列)。

示例:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({
    'a': pd.Series([1,1,1,2,2,2]),
    'b': pd.Series([1,2,np.NaN,1,np.NaN,4])
})

print df

输入

   a   b
0  1   1
1  1   2
2  1 NaN
3  2   1
4  2 NaN
5  2   4

输出(在 groupby('a') 之后并用组替换 NaN)

   a    b
0  1  1.0
1  1  2.0
2  1  1.5
3  2  1.0
4  2  2.5
5  2  4.0

【问题讨论】:

  • 对不起,您是专门在这里要求输出的吗?
  • 此输出只是一个示例,但假设您在不同的其他列 b、c、d 等中有许多 NaN...
  • 将来发布您的完整需求会很有用,因为它很重要并且会影响答案

标签: python pandas


【解决方案1】:

IIUC 然后你可以调用fillna,结果是'a'上的groupby和'b'上的transform:

In [44]:
df['b'] = df['b'].fillna(df.groupby('a')['b'].transform('mean'))
df

Out[44]:
   a    b
0  1  1.0
1  1  2.0
2  1  1.5
3  2  1.0
4  2  2.5
5  2  4.0

如果您有多个 NaN 值,那么我认为以下应该可行:

In [47]:
df.fillna(df.groupby('a').transform('mean'))

Out[47]:
   a    b
0  1  1.0
1  1  2.0
2  1  1.5
3  2  1.0
4  2  2.5
5  2  4.0

编辑

In [49]:
df = pd.DataFrame({
    'a': pd.Series([1,1,1,2,2,2]),
    'b': pd.Series([1,2,np.NaN,1,np.NaN,4]),
    'c': pd.Series([1,np.NaN,np.NaN,1,np.NaN,4]),
    'd': pd.Series([np.NaN,np.NaN,np.NaN,1,np.NaN,4])
})
df

Out[49]:
   a   b   c   d
0  1   1   1 NaN
1  1   2 NaN NaN
2  1 NaN NaN NaN
3  2   1   1   1
4  2 NaN NaN NaN
5  2   4   4   4

In [50]:
df.fillna(df.groupby('a').transform('mean'))

Out[50]:
   a    b    c    d
0  1  1.0  1.0  NaN
1  1  2.0  1.0  NaN
2  1  1.5  1.0  NaN
3  2  1.0  1.0  1.0
4  2  2.5  2.5  2.5
5  2  4.0  4.0  4.0

你得到所有NaN for 'd' 因为所有值都是NaN for group 1 for d

【讨论】:

  • 您编辑的答案是我正在寻找的。谢谢。
【解决方案2】:

我们首先计算组均值,忽略缺失值:

group_means = df.groupby('a')['b'].agg(lambda v: np.nanmean(v))

接下来,我们再次使用groupby,这次获取对应的值:

df_new = df.groupby('a').apply(lambda t: t.fillna(group_means.loc[t['a'].iloc[0]]))

【讨论】:

    猜你喜欢
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多