您好,我有一个数据框,例如:
Groups Nb Event VALUE1 VALUE2 Seqs Other_colum
Groupe1 2.0 19.0 0.2971 0.000000 Seq0 30
Groupe1 2.0 19.0 0.2971 0.000000 Seq1 NaN
Groupe1 2.0 19.0 NaN NaN Seq2 49
Groupe1 4.0 12.0 0.1 2.3 Seq3 34
Groupe1 3.0 3.0 0.9601 0.825981 Seq6 67
Groupe1 3.0 3.0 0.9601 0.825981 Seq7 NaN
Groupe3 1.0 1.0 NaN NaN Seq4 78
Groupe3 1.0 1.0 NaN NaN Seq5 67
Groupe3 1.0 3.0 NaN NaN Seq6 89
Groupe3 1.0 3.0 0.4 0.45 Seq7 NaN
并且我想在Groups
和{{中没有NaN值时,在NaN
中填充VALUE1
和VALUE2
中的Nb
值1}}。
例如:
在Groupe1内
有
Event
然后我检查对应的Groups Nb Event VALUE1 VALUE2 Seqs
Groupe1 2.0 19.0 NaN NaN Seq2
和Nb
是否在Event
和VALUE1
中具有值,在这里是,这些值是:0.2971&0.000000
VALUE2
所以我将此值添加到NaN值
Groups Nb Event VALUE1 VALUE2 Seqs
Groupe1 2.0 19.0 0.2971 0.000000 Seq0
Groupe1 2.0 19.0 0.2971 0.000000 Seq1
在,我应该得到:
Groups Nb Event VALUE1 VALUE2 Seqs
Groupe1 2.0 19.0 0.2971 0.000000 Seq2
我猜想算法的想法是:
Groups Nb Event VALUE1 VALUE2 Seqs Other_colum
Groupe1 2.0 19.0 0.2971 0.000000 Seq0 30
Groupe1 2.0 19.0 0.2971 0.000000 Seq1 NaN
Groupe1 2.0 19.0 0.2971 0.000000 Seq2 49
Groupe1 4.0 12.0 0.1 2.3 Seq3 34
Groupe1 3.0 3.0 0.9601 0.825981 Seq6 67
Groupe1 3.0 3.0 0.9601 0.825981 Seq7 NaN
Groupe3 1.0 1.0 NaN NaN Seq4 78
Groupe3 1.0 1.0 NaN NaN Seq5 67
Groupe3 1.0 3.0 0.4 0.45 Seq6 89
Groupe3 1.0 3.0 0.4 0.45 Seq7 NaN
答案 0 :(得分:2)
我们可以在groupby
上使用Groups, Nb, Event
,然后使用回填(bfill
)和正向填充(ffill
)来填充NaN
:
df.groupby(['Groups', 'Nb', 'Event']).apply(lambda x: x.bfill().ffill())
Groups Nb Event VALUE1 VALUE2 Seqs
0 Groupe1 2.0 19.0 0.2971 0.000000 Seq0
1 Groupe1 2.0 19.0 0.2971 0.000000 Seq1
2 Groupe1 2.0 19.0 0.2971 0.000000 Seq2
3 Groupe1 4.0 12.0 0.1000 2.300000 Seq3
4 Groupe1 3.0 3.0 0.9601 0.825981 Seq6
5 Groupe1 3.0 3.0 0.9601 0.825981 Seq7
6 Groupe3 1.0 1.0 NaN NaN Seq4
7 Groupe3 1.0 1.0 NaN NaN Seq5
8 Groupe3 1.0 3.0 0.4000 0.450000 Seq6
9 Groupe3 1.0 3.0 0.4000 0.450000 Seq7
要仅填充某些列,请在应用方法之前选择这些列:
grps = ['Groups', 'Nb', 'Event']
values = ['VALUE1', 'VALUE2']
df[values] = df.groupby(grps)[values].apply(lambda x: x.bfill().ffill())
# or df.groupby(grps).apply(lambda x: x[values].bfill().ffill())
旁注:由于数据效率低下,并且熊猫提供了解决这些问题的方法,因此通常不需要迭代数据。