【问题标题】:Inplace Forward Fill on a multi-level column dataframe在多级列数据框中就地前向填充
【发布时间】:2018-01-29 15:23:15
【问题描述】:

我有以下数据框:

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) 

但生成的数据框没有向前填充任何值。 如何仅为这两列创建包含前向填充数据的数据框?

【问题讨论】:

  • 在 v0.20 上为我工作。你用的是什么版本?
  • 这里一样,0.20 pandas 效果很好
  • 我使用的是 0.20.3 版本。该函数没有报错,但是如果我打印df,NaN数据仍然存在。

标签: python pandas dataframe hierarchical fillna


【解决方案1】:

我相信问题出在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') 

【讨论】:

  • 谢谢,确实有效。但是,它在我的原始数据帧(具有 30*3000 列和 163000 行)上非常慢。虽然前向填充计算(df[ffill_list].ffill(limit=None) 大约需要 3 秒),但 df 中的分配需要 5 分钟(使用 df.loc[:,ffill_list] = df[ffill_list].ffill(limit =无))。
  • @user6538642 害怕基于 loc 的设置是更新切片的唯一方式。
  • @user6538642 抱歉,忽略inplace=True,它对切片不起作用,因为不幸的是,inplace=True 也会创建副本。
【解决方案2】:

上面的答案对我不起作用,但确实如此:

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

IIUC,.loc 方法已经被贬值了。

【讨论】:

    猜你喜欢
    • 2020-01-06
    • 1970-01-01
    • 2020-01-26
    • 2020-04-27
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多