pandas:在(多索引)DataFrame 上执行 fillna() 的最佳方法是什么,每个组中出现频率最高的值?

pandas: What is the best way to do fillna() on a (multiindexed) DataFrame with the most frequent value from every group?

有一个包含一些 NaN 值的 DataFrame:

df = pd.DataFrame({'A': [1, 1, 1, 1, 2, 2, 2, 2], 'B': [1, 1, np.NaN, 2, 3, np.NaN, 3, 4]})

   A    B
0  1  1.0
1  1  1.0
2  1  NaN <-
3  1  2.0
4  2  3.0
5  2  NaN <-
6  2  3.0
7  2  4.0

设置标签'A'作为索引:

df.set_index(['A'], inplace=True)

现在有两个索引为 1 和 2 的组:

     B
A     
1  1.0
1  1.0
1  NaN <-
1  2.0
2  3.0
2  NaN <-
2  3.0
2  4.0

使用每个组中最频繁值的 DataFrame 执行 fillna() 的最佳方法是什么?

所以,我想做这样的调用:

df.B.fillna(df.groupby('A').B...)

并得到:

     B
A     
1  1.0
1  1.0
1  1.0 <-
1  2.0
2  3.0
2  3.0 <-
2  3.0
2  4.0

我希望有办法,它也适用于多索引。

  • groupby 列 A 并将 fillna() 应用于每个组中的 B;
  • 删除序列中的缺失值,然后value_counts,使用idxmax()选取最频繁的值;

假设没有所有值都缺失的组:

df['B'] = df.groupby('A')['B'].transform(lambda x: x.fillna(x.dropna().value_counts().idxmax()))
df