您好,我需要根据另一列中的共识值来更改某些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
中的4
和group1
在col2
中被更改为SeqA
,因为该组中有两个相同的seqs 6
。< / p>
您可以看到7
中的group2
和col2
在SeqB
中被更改为seq 8
,因为该组中有一个相同的group3
。 / p>
您可以看到col2
在SeqC
中更改为roup4
,因为两个相同的seq 14
在该组中仅与g中的一个{{ 1}}。
您可以看到NaN
仍然是col2
,因为在SeqD
中对于pyglet.image.get_buffer_manager().get_color_buffer().get_image_data()
没有共识。
有人对熊猫有想法吗?谢谢您的帮助。
答案 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