Python Dataframe:使用与前一行不同的列更改NaN单元格值

Python Dataframe:使用与前一行不同的列更改NaN单元格值,python,python-3.x,pandas,numpy,Python,Python 3.x,Pandas,Numpy,我想在数据帧中循环,并将第2行['Col1'](循环中的当前行)中的NaN值替换为第1行['Col3'](与循环中以前的记录不同的列)一种方法是使用stack,ffill,和取消stack: import pandas as pd import numpy as np data = np.array([['', 'Col1', 'Col2', 'Col3'], ['Row1', 1, 2, 3], ['Row2', np.na

我想在数据帧中循环,并将第2行['Col1'](循环中的当前行)中的NaN值替换为第1行['Col3'](与循环中以前的记录不同的列)

一种方法是使用
stack
ffill
,和
取消stack

import pandas as pd
import numpy as np

data = np.array([['', 'Col1', 'Col2', 'Col3'],
                 ['Row1', 1, 2, 3],
                 ['Row2', np.nan, 5, 6],
                 ['Row3', 7, 8, 9]
                 ])

df = pd.DataFrame(data=data[1:, 1:],
                  index=data[1:,0],
                  columns=data[0,1:])


OutPut:
     Col1 Col2 Col3
Row1    1    2    3
Row2  nan    5    6
Row3    7    8    9
输出:

df.stack(dropna=False).ffill().unstack()

一种方法是使用
stack
ffill
unstack

import pandas as pd
import numpy as np

data = np.array([['', 'Col1', 'Col2', 'Col3'],
                 ['Row1', 1, 2, 3],
                 ['Row2', np.nan, 5, 6],
                 ['Row3', 7, 8, 9]
                 ])

df = pd.DataFrame(data=data[1:, 1:],
                  index=data[1:,0],
                  columns=data[0,1:])


OutPut:
     Col1 Col2 Col3
Row1    1    2    3
Row2  nan    5    6
Row3    7    8    9
输出:

df.stack(dropna=False).ffill().unstack()

在更换nan之前,您还有一件事需要解决:

1:您使用的是数组,数组不接受联接类型,这意味着您的nan不再是np.nan,而是“nan”

     Col1 Col2 Col3
Row1    1    2    3
Row2    3    5    6
Row3    7    8    9

在更换nan之前,您还有一件事需要解决:

1:您使用的是数组,数组不接受联接类型,这意味着您的nan不再是np.nan,而是“nan”

     Col1 Col2 Col3
Row1    1    2    3
Row2    3    5    6
Row3    7    8    9

很抱歉,我没有发布我的数据集中的实际数据,因此:

df.combine_first(pd.DataFrame(np.roll(np.concatenate(df.values),1).reshape(3,3),index=df.index,columns=df.columns))
Out[1240]: 
     Col1 Col2 Col3
Row1    1    2    3
Row2    3    5    6
Row3    7    8    9
我需要脚本在“打开”列中找到任何“NaN”,并将其替换为前一行中的“Last”(此处用双星号突出显示)

我感谢所有的帖子,然而,这就是最终起作用的原因:

             Open   High    Low   Last  Change  Settle   Volume  
Date                                                              
2017-05-22  51.97  52.28  51.73  **51.96**    0.49   52.05  70581.0   
2017-05-23    **NaN**  52.44  51.61  52.31    0.24   52.35   9003.0   
2017-05-24  52.34  52.63  51.91  52.05    0.23   52.12  11678.0   
2017-05-25  52.25  52.61  49.49  49.59    2.28   49.84  19721.0   
2017-05-26  49.82  50.73  49.34  50.73    0.82   50.66  11214.0 

很抱歉,我没有发布我的数据集中的实际数据,因此:

df.combine_first(pd.DataFrame(np.roll(np.concatenate(df.values),1).reshape(3,3),index=df.index,columns=df.columns))
Out[1240]: 
     Col1 Col2 Col3
Row1    1    2    3
Row2    3    5    6
Row3    7    8    9
我需要脚本在“打开”列中找到任何“NaN”,并将其替换为前一行中的“Last”(此处用双星号突出显示)

我感谢所有的帖子,然而,这就是最终起作用的原因:

             Open   High    Low   Last  Change  Settle   Volume  
Date                                                              
2017-05-22  51.97  52.28  51.73  **51.96**    0.49   52.05  70581.0   
2017-05-23    **NaN**  52.44  51.61  52.31    0.24   52.35   9003.0   
2017-05-24  52.34  52.63  51.91  52.05    0.23   52.12  11678.0   
2017-05-25  52.25  52.61  49.49  49.59    2.28   49.84  19721.0   
2017-05-26  49.82  50.73  49.34  50.73    0.82   50.66  11214.0