在多级列数据框上就地前向填充
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
访问切片,然后将 ffill
ed 数据帧切片返回:
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
方法已贬值。
我有以下数据框:
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
访问切片,然后将 ffill
ed 数据帧切片返回:
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
方法已贬值。