我有以下数据框:
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 对我不起作用。实际上,我的数据框有很多很多列(数百个),我正在寻找一种不必明确提及所有列的方法。
答案 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
。