Python Dataframe:使用与前一行不同的列更改NaN单元格值
我想在数据帧中循环,并将第2行['Col1'](循环中的当前行)中的NaN值替换为第1行['Col3'](与循环中以前的记录不同的列)一种方法是使用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
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