簡體   English   中英

使用 Pandas 中的條件填充 NaN 值而不是 df

[英]Fill NaN values withont df with conditions in pandas

您好,我有一個數據框,例如:

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價值觀VALUE1VALUE2當存在相對應的沒有價值的NaN NbEvent

舉個例子 :

Groupe1內

Groups     Nb    Event    VALUE1     VALUE2    Seqs
Groupe1    2.0   19.0     NaN        NaN       Seq2

然后我檢查相應的NbEventVALUE1VALUE2是否有值,這里是的值是:0.2971 和 0.000000

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

所以我將此值添加到 NaN 值

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 

我猜算法的想法是:

iterate over Groups within the table :
 then check where df['VALUE1'].isna() & df['VALUE2'].isna():
    look at the corresponding df['Event'] & df['Nb']
        if the correspond VALUE1  &  VALUE2 are not NaN
            fill the previous NaN 

我們可以在Groups, Nb, Event上使用groupby Groups, Nb, Event然后使用 backfill ( bfill ) 和 forwardfill ( 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())

旁注:通常我們不需要迭代我們的數據,因為它效率低下,pandas 提供了解決這些問題的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM