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
有一个包含一些 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