Python 用其他列中的值替换所有NaN值

Python 用其他列中的值替换所有NaN值,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧: df = pd.DataFrame([[np.nan, 2, np.nan, 0], [3, 4, np.nan, 1], [np.nan, np.nan, 5, np.nan], [np.nan, 3, np.nan, 4]], columns=list('ABCD')) 我想用df[“B”].ffill(inplace=Tr

我有以下数据帧:

df = pd.DataFrame([[np.nan, 2, np.nan, 0],
                   [3, 4, np.nan, 1],
                   [np.nan, np.nan, 5, np.nan],
                   [np.nan, 3, np.nan, 4]],
                  columns=list('ABCD'))
我想用
df[“B”].ffill(inplace=True)
对B列执行
ffill()
,这将产生以下df:

     A    B    C    D
0  NaN  2.0  NaN  0.0
1  3.0  4.0  NaN  1.0
2  NaN  4.0  5.0  NaN
3  NaN  3.0  NaN  4.0
现在我想用列B中的对应值替换所有NaN值。您可以给出的状态是
fillna()
a系列,因此我尝试了
df.fillna(df[“B”],inplace=True)
。这将产生与上面完全相同的数据帧

但是,如果我输入一个简单的值(例如,
df.fillna(0,inplace=True)
,那么它确实有效:

     A    B    C    D
0  0.0  2.0  0.0  0.0
1  3.0  4.0  0.0  1.0
2  0.0  4.0  5.0  0.0
3  0.0  3.0  0.0  4.0
有趣的是,当对另一个Series对象进行操作时,
fillna()
似乎确实可以将Series作为
参数使用。例如,
df[“a”]。fillna(df[“B”],inplace=True)
会导致:

     A    B   C  D
0  2.0  2.0 NaN  0
1  3.0  4.0 NaN  1
2  4.0  4.0 NaN  5
3  3.0  3.0 NaN  4
我真正的数据框架有很多列,我不愿意手动
fillna()
所有列。我是否忽略了一些内容?我可能没有正确理解文档吗


编辑我以这样一种方式澄清了我的示例,axis=1的“ffill”不适用于我。实际上,我的数据框有很多很多列(数百列),我正在寻找一种不必显式提及所有列的方法。

尝试将axis更改为1(列):

如果需要指定列,可以执行以下操作:

df[["B","C"]] = df[["B","C"]].ffill(1)

编辑: 由于您需要一些更通用的东西,而且尚未实现df.fillna(df.B,axis=1),因此您可以尝试使用:

df = df.T.fillna(df.B).T
或者,相当于:

df.T.fillna(df.B, inplace=True)
这是因为
df.B
的索引与
df.T
的列一致,因此熊猫将知道如何替换它。从文档中:

值:标量、dict、序列或数据帧。 用于填充孔的值(例如0),或者是一个dict/Series/DataFrame值,指定每个索引(对于系列)或列(对于数据帧)使用哪个值。dict/Series/DataFrame中不包含的值将不会被填充。此值不能是列表


因此,例如,行
A
(在
df.T
中)列
0
中的
NaN
将替换为
df.B
中索引
0
的值尝试将轴更改为1(列):

如果需要指定列,可以执行以下操作:

df[["B","C"]] = df[["B","C"]].ffill(1)

编辑: 由于您需要一些更通用的东西,而且尚未实现df.fillna(df.B,axis=1),因此您可以尝试使用:

df = df.T.fillna(df.B).T
或者,相当于:

df.T.fillna(df.B, inplace=True)
这是因为
df.B
的索引与
df.T
的列一致,因此熊猫将知道如何替换它。从文档中:

值:标量、dict、序列或数据帧。 用于填充孔的值(例如0),或者是一个dict/Series/DataFrame值,指定每个索引(对于系列)或列(对于数据帧)使用哪个值。dict/Series/DataFrame中不包含的值将不会被填充。此值不能是列表


因此,例如,列
0
中的
NaN
在行
A
(在
df.T
中)将替换为
df.B

Hm中索引
0
的值,这在这个最小可复制的示例中有效,但我希望从特定列中获取值,而不仅仅是之前的一列,使用非NaN值。实际上,我有许多列可能有值,也可能没有值,我确实需要从列中获取值B@PabloC,IMHO,j仅供参考,您最近的编辑已使您的第一个答案与我的答案完全相同,仅供参考,请注意,我以前曾发布过此答案,在此处进行评论,以便避免混淆:)cheers@RavinderSingh13很抱歉这不是故意的我只是意识到是better@JarroVGIT我本来打算在这里解释的,但我决定修改我的答案。我希望如此helps@JarroVGIT嗯,这很好,你知道:PHm,这在这个最小可重复的例子中有效,但我想要一个特定列的值,而不仅仅是之前的一个非NaN值的列。实际上,我有很多列可能有值,也可能没有值,我真的需要列中的值B@PabloC,IMHO,仅供参考,您最近的编辑已使您的第一个答案与我的答案完全相同,仅供参考,请注意,我以前曾发布过此答案,在此处进行评论,以便避免混淆:)cheers@RavinderSingh13很抱歉这不是故意的我只是意识到是better@JarroVGIT我本来打算在这里解释的,但我决定修改我的答案。我希望如此helps@JarroVGIT嗯,很好,你知道:P