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