Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python数据帧中冻结NaN之间的序列中的第一个数字_Python_Pandas_Dataframe_Time Series_Nan - Fatal编程技术网

如何在Python数据帧中冻结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

在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.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。