根据熊猫另一栏中的共识值更改NaN值

时间:2019-04-18 08:38:20

标签: python-3.x pandas

您好,我需要根据另一列中的共识值来更改某些NaN值,所以这里是示例:

tab1

col1    col2    col3
seq1    NaN     SeqA
seq2    group1  SeqA
seq3    group1  SeqA
seq4    NaN     SeqA
seq5    group2  SeqB
seq6    NaN     SeqB
seq7    NaN     SeqB
seq8    NaN     SeqC
seq9    group3  SeqC
seq10   group3  SeqC
seq11   group4  SeqC
seq12   group5  SeqD
seq13   group6  SeqD
seq14   NaN     SeqD 
seq15   group7  NaN
seq16   group7  NaN

并且想法是将其更改为:

col1    col2    col3
seq1    group1  SeqA
seq2    group1  SeqA
seq3    group1  SeqA
seq4    group1  SeqA
seq5    group2  SeqB
seq6    group2  SeqB
seq7    group2  SeqB
seq8    group3  SeqC
seq9    group3  SeqC
seq10   group3  SeqC
seq11   group4  SeqC
seq12   group5  SeqD
seq13   group6  SeqD
seq14   NaN     SeqD 
  • 您可以看到seqs 1中的4group1col2中被更改为SeqA,因为该组中有两个相同的seqs 6。< / p>

  • 您可以看到7中的group2col2SeqB中被更改为seq 8,因为该组中有一个相同的group3。 / p>

  • 您可以看到col2SeqC中更改为roup4,因为两个相同的seq 14在该组中仅与g中的一个{{ 1}}。

  • 您可以看到NaN仍然是col2,因为在SeqD中对于pyglet.image.get_buffer_manager().get_color_buffer().get_image_data()没有共识。

有人对熊猫有想法吗?谢谢您的帮助。

2 个答案:

答案 0 :(得分:3)

尝试以下代码:

df.groupby('col3')['col2'].apply(lambda x: x.fillna(x.mode()[0]))

由于@jezrael正确指出,由于非共识,最后一个值应为NaN:

def func(x):
     if len(x.value_counts()) ==1:
             return x.fillna(x.mode()[0])
     elif x.value_counts()[0] != x.value_counts()[1]:
             return x.fillna(x.mode()[0])
     else:
             return x

df.groupby('col3')['col2'].apply(lambda x: func(x))

答案 1 :(得分:2)

使用自定义函数避免在最后一种情况下替换NaN

def f(x):
    c = x['col2'].value_counts()
    if c.empty:
        return x
    elif (len(c) == 1) or (c.nunique() != 1):
        x['col2'] = x['col2'].fillna(c.index[0])
    return x

df = df.groupby('col3').apply(f)
print (df)
     col1    col2  col3
0    seq1  group1  SeqA
1    seq2  group1  SeqA
2    seq3  group1  SeqA
3    seq4  group1  SeqA
4    seq5  group2  SeqB
5    seq6  group2  SeqB
6    seq7  group2  SeqB
7    seq8  group3  SeqC
8    seq9  group3  SeqC
9   seq10  group3  SeqC
10  seq11  group4  SeqC
11  seq12  group5  SeqD
12  seq13  group6  SeqD
13  seq14     NaN  SeqD