[英]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
價值觀VALUE1
和VALUE2
當存在相對應的沒有價值的NaN Nb
和Event
。
舉個例子 :
Groupe1內
有
Groups Nb Event VALUE1 VALUE2 Seqs
Groupe1 2.0 19.0 NaN NaN Seq2
然后我檢查相應的Nb
和Event
在VALUE1
和VALUE2
是否有值,這里是的值是: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.