如何在Python数据帧中冻结NaN之间的序列中的第一个数字
在timeseries数据帧中,是否有一种python方法可以按列向下选择序列中的第一个数字,然后将其向前推到下一个NaN,然后获取下一个非NaN数字并向下推到下一个NaN,依此类推(保留索引和NaN) 例如,我想转换此数据帧:如何在Python数据帧中冻结NaN之间的序列中的第一个数字,python,pandas,dataframe,time-series,nan,Python,Pandas,Dataframe,Time Series,Nan,在timeseries数据帧中,是否有一种python方法可以按列向下选择序列中的第一个数字,然后将其向前推到下一个NaN,然后获取下一个非NaN数字并向下推到下一个NaN,依此类推(保留索引和NaN) 例如,我想转换此数据帧: DF = pd.DataFrame(data={'A':[np.nan,1,3,5,7,np.nan,2,4,6,np.nan], 'B':[8,6,4,np.nan,np.nan,9,7,3,np.nan,3], 'C':[np.nan,np.nan,4,2,6,np
DF = pd.DataFrame(data={'A':[np.nan,1,3,5,7,np.nan,2,4,6,np.nan], 'B':[8,6,4,np.nan,np.nan,9,7,3,np.nan,3], 'C':[np.nan,np.nan,4,2,6,np.nan,1,5,2,8]})
Result = pd.DataFrame(data={'A':[np.nan,1,1,1,1,np.nan,2,2,2,np.nan], 'B':[8,8,8,np.nan,np.nan,9,9,9,np.nan,3], 'C':[np.nan,np.nan,4,4,4,np.nan,1,1,1,1]})
对于此数据帧:
DF = pd.DataFrame(data={'A':[np.nan,1,3,5,7,np.nan,2,4,6,np.nan], 'B':[8,6,4,np.nan,np.nan,9,7,3,np.nan,3], 'C':[np.nan,np.nan,4,2,6,np.nan,1,5,2,8]})
Result = pd.DataFrame(data={'A':[np.nan,1,1,1,1,np.nan,2,2,2,np.nan], 'B':[8,8,8,np.nan,np.nan,9,9,9,np.nan,3], 'C':[np.nan,np.nan,4,4,4,np.nan,1,1,1,1]})
我知道我可以使用循环来遍历列来完成这项工作,但是如果能在非常大的数据帧上以更高效的Pythonic方式来完成这项工作,我将不胜感激。谢谢。IIUC:
# where DF is not NaN
mask = DF.notna()
Result = (DF.shift(-1) # fill the original NaN's with their next value
.mask(mask) # replace all the original non-NaN with NaN
.ffill() # forward fill
.fillna(DF.iloc[0]) # starting of the the columns with a non-NaN
.where(mask) # replace the original NaN's back
)
输出:
A B C
0 NaN 8.0 NaN
1 1.0 8.0 NaN
2 1.0 8.0 4.0
3 1.0 NaN 4.0
4 1.0 NaN 4.0
5 NaN 9.0 NaN
6 2.0 9.0 1.0
7 2.0 9.0 1.0
8 2.0 NaN 1.0
9 NaN 3.0 1.0
IIUC:
输出:
A B C
0 NaN 8.0 NaN
1 1.0 8.0 NaN
2 1.0 8.0 4.0
3 1.0 NaN 4.0
4 1.0 NaN 4.0
5 NaN 9.0 NaN
6 2.0 9.0 1.0
7 2.0 9.0 1.0
8 2.0 NaN 1.0
9 NaN 3.0 1.0
哇!真聪明!非常感谢你@Quang Hoang.Wow。真聪明!非常感谢您@Quang Hoang。