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

时间:2021-02-09 00:09:11

标签: 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'))

我想在 B 列上用 ffill() 做一个 df["B"].ffill(inplace=True),这会导致以下 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 值。documentation 声明您可以给 fillna() 一个系列,所以我尝试了 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 作为 value 参数使用。例如,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() 所有这些列。我在这里忽略了什么吗?我可能没有正确理解文档吗?

EDIT 我已经澄清了我的例子,'ffill' with axis=1 对我不起作用。实际上,我的数据框有很多很多列(数百个),我正在寻找一种不必明确提及所有列的方法。

1 个答案:

答案 0 :(得分:2)

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

df = df.ffill(1).bfill(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 的列重合,因此大熊猫将知道如何替换它。来自文档:

<块引用>

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

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

相关问题