将数据从一列回填到另一列

时间:2015-03-18 07:26:10

标签: python pandas

这就是我的数据:

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

1 个答案:

答案 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