在多级列数据框上就地前向填充

Inplace Forward Fill on a multi-level column dataframe

我有以下数据框:

arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'],
 ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
df = pd.DataFrame(np.random.randn(3, 8), index=['A', 'B', 'C'], columns=index)
df.loc["B", (slice(None), 'two')]=np.nan

现在,我想前向填充 "baz" 和 "foo" 列的数据(所以不是 "bar" 和 "qux" 列)。我试过了:

 df[["baz", "foo"]].ffill(inplace=True) 

但是生成的数据框没有前向填充任何值。 我怎样才能为这两列创建一个前向填充数据的数据框?

我认为问题出在 inplace=True 设置上。尝试使用 df.loc 访问切片,然后将 ffilled 数据帧切片返回:

df.loc[:, ["baz", "foo"]] = df[["baz", "foo"]].ffill() 

输出:

first        baz                 foo          
second       one       two       one       two
A       0.465254  0.629161 -0.176656 -1.263927
B       2.051213  0.629161  1.539584 -1.263927
C      -0.463592 -0.240445 -0.014090  0.170188

或者,您可以使用 df.fillna(method='ffill'):

df.loc[:, ["baz", "foo"]] = df[["baz", "foo"]].fillna(method='ffill') 

上面的答案对我不起作用,但这个答案对我有用:

df.loc[:, pd.IndexSlice[:, ['baz', 'foo']] = df.loc[:, pd.IndexSlice[:, 'baz', foo']].fillna(method='ffill')

IIUC,loc 方法已贬值。