用熊猫中的条件用df填充NaN值

时间:2020-11-01 11:49:53

标签: python pandas dataframe

您好,我有一个数据框,例如:

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中填充VALUE1VALUE2中的Nb值1}}。

例如:

在Groupe1内

Event

然后我检查对应的Groups Nb Event VALUE1 VALUE2 Seqs Groupe1 2.0 19.0 NaN NaN Seq2 Nb是否在EventVALUE1中具有值,在这里是,这些值是: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 

1 个答案:

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

旁注:由于数据效率低下,并且熊猫提供了解决这些问题的方法,因此通常不需要迭代数据。