Python 快速获取从数据帧中最后一个有效值开始计算的列中NAN数的方法

Python 快速获取从数据帧中最后一个有效值开始计算的列中NAN数的方法,python,pandas,dataframe,cumsum,Python,Pandas,Dataframe,Cumsum,假设我有一个像 A B 0 0.1880 0.345 1 0.2510 0.585 2 NaN NaN 3 NaN NaN 4 NaN 1.150 5 0.2300 1.210 6 0.1670 1.290 7 0.0835 1.400 8 0.0418 NaN 9 0.0209 NaN 10 NaN NaN 11 NaN

假设我有一个像

    A       B      
0   0.1880  0.345 
1   0.2510  0.585  
2   NaN     NaN  
3   NaN     NaN 
4   NaN     1.150  
5   0.2300  1.210  
6   0.1670  1.290  
7   0.0835  1.400  
8   0.0418  NaN    
9   0.0209  NaN    
10  NaN     NaN    
11  NaN     NaN    
12  NaN     NaN     
我想要一个相同形状的新数据框,其中每个条目表示从最后一个有效值开始计算到其位置的NAN数,如下所示

    A       B      
0   0       0    
1   0       0  
2   1       1  
3   2       2 
4   3       0  
5   0       0 
6   0       0 
7   0       0 
8   0       1    
9   0       2   
10  1       3   
11  2       4 
12  3       5     
我想知道是否可以通过使用一些Pandas/Numpy功能有效地实现这一点

您可以使用:

a = df.isnull()
b = a.cumsum()
df1 = b.sub(b.mask(a).ffill().fillna(0).astype(int))
print (df1)
    A  B
0   0  0
1   0  0
2   1  1
3   2  2
4   3  0
5   0  0
6   0  0
7   0  0
8   0  1
9   0  2
10  1  3
11  2  4
12  3  5
为了更好地理解:

#add NaN where True in a
a2 = b.mask(a)
#forward filling NaN
a3 = b.mask(a).ffill()
#replace NaN to 0, cast to int
a4 = b.mask(a).ffill().fillna(0).astype(int)
#substract b to a4
a5 = b.sub(b.mask(a).ffill().fillna(0).astype(int))
df1 = pd.concat([a,b,a2, a3, a4, a5], axis=1, 
                keys=['a','b','where','ffill nan','substract','output'])
print (df1)
        a         b    where      ffill nan      substract    output   
        A      B  A  B     A    B         A    B         A  B      A  B
0   False  False  0  0   0.0  0.0       0.0  0.0         0  0      0  0
1   False  False  0  0   0.0  0.0       0.0  0.0         0  0      0  0
2    True   True  1  1   NaN  NaN       0.0  0.0         0  0      1  1
3    True   True  2  2   NaN  NaN       0.0  0.0         0  0      2  2
4    True  False  3  2   NaN  2.0       0.0  2.0         0  2      3  0
5   False  False  3  2   3.0  2.0       3.0  2.0         3  2      0  0
6   False  False  3  2   3.0  2.0       3.0  2.0         3  2      0  0
7   False  False  3  2   3.0  2.0       3.0  2.0         3  2      0  0
8   False   True  3  3   3.0  NaN       3.0  2.0         3  2      0  1
9   False   True  3  4   3.0  NaN       3.0  2.0         3  2      0  2
10   True   True  4  5   NaN  NaN       3.0  2.0         3  2      1  3
11   True   True  5  6   NaN  NaN       3.0  2.0         3  2      2  4
12   True   True  6  7   NaN  NaN       3.0  2.0         3  2      3  5

你试过什么吗?@Dadep我只能用双循环来做,我真的认为我不够快。你通常有多少列?通常有多少行?@Divakar通常都大于1000但小于10k。