这就是我的数据:
colA colB
a 1
a 1
c 2
c 2
Nan 1
c 1
a 2
Nan 2
我想在colA中填补Nans。结果应如下所示:
colA colB
a 1
a 1
c 2
c 2
a 1
c 1
a 2
c 2
第5行填充'a',因为colB = 1且colB中的整体1已映射到比col中的c更多a
第8行被'c'填充,因为colB = 2并且colB中的整体2已被映射到比colA中的更多c
答案 0 :(得分:1)
您可以在群组中使用mode(忽略绘制):
In [11]: df
Out[11]:
colA colB
0 a 1
1 a 1
2 c 2
3 c 2
4 NaN 1
5 c 1
6 a 2
7 NaN 2
In [12]: modes = df.groupby('colB')['colA'].transform(lambda x: x.mode().iloc[0])
In [13]: modes
Out[13]:
0 a
1 a
2 c
3 c
4 a
5 a
6 c
7 c
Name: colA, dtype: object
使用fillna仅替换NaN的模式:
In [14]: df['colA'].fillna(modes)
Out[14]:
0 a
1 a
2 c
3 c
4 a
5 c
6 a
7 c
Name: colA, dtype: object
In [15]: df['colA'] = df['colA'].fillna(modes)
注意:阅读文档,如果没有项目至少出现一次,这将会提高,因此您可能希望在转换中使用更强大的函数:
def mymode(s):
try:
return s.mode().iloc[0]
except IndexError:
# just pick the first element, even though it occurs only once, even if it's NaN
return s.iloc[0] if len(s) >= 1 else np.nan