用 Groupby 替换值

Replace Values With Groupby

我有一个包含数字列的数据框,其中一列包含一些 'tbd' 值。我想用其他列的 groupby 的平均值替换那些 'tbd' 值。我知道您可以使用以下方法填充值

df['col_d'] = df.groupby(['col_a', 'col_b'])['col_c'].transform(lambda x: x.fillna(x.round().mean()))

我不能使用 fillna,因为我已经有了 na 值,而且我不想删除它们并追加它们,因为我稍后会需要它们。我知道我可以使用映射,但我想知道是否有更优雅的替换方法?

输入 col_b 包含 NaN 和 'tbd' 我想使用 col_a 和 col_c 的分组依据来填充 'tbd'

col_a   col_b   col_c
  1       1       1
  2       2       2
  3     'tbd'     3
  3     'tbd'     3
  5       5       5
  6      NaN      6

输出使用 col_a 和 col_c

的平均值
col_a   col_b   col_c
  1       1       1
  2       2       2
  6       7       8
  5       6       7
  5       5       5
  6      NaN      6 

简单的例子,但我相信它解释了这个问题,它实质上是用 replace 方法代替了我列出的示例 lambda 函数的 fillna 方法

可以用np.where,用to_numeric改成nan 'tbd'就可以进行均值运算了

# dummy data
df = pd.DataFrame({
    'col_a':['a']*8, 'col_b':['b','c']*4,
    'col_c':[1,1,np.nan,np.nan,'tbd',3,4,'tbd']
})

df['col_d'] = np.where(
    df['col_c'].eq('tbd'), 
    pd.to_numeric(df['col_c'], errors='coerce')
      .groupby([df['col_a'],df['col_b']]).transform('mean'), 
    df['col_c']
)

print(df)
#   col_a col_b col_c col_d
# 0     a     b     1     1
# 1     a     c     1     1
# 2     a     b   NaN   NaN
# 3     a     c   NaN   NaN
# 4     a     b   tbd   2.5
# 5     a     c     3     3
# 6     a     b     4     4
# 7     a     c   tbd   2.0