2017-08-21 39 views
0

我有以下數據框:就地正向上多層次的列數據框填寫

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 

現在,我要轉發填補列「巴茲」和「富」就地數據(所以不列「酒吧」和「qux」)。我試過了:

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

但是生成的數據幀沒有向前填充任何值。 如何才能創建一個數據幀,只有這兩列的轉發填充數據?

+1

Works的我在v0.20。你使用什麼版本? –

+0

同樣在這裏,0.20熊貓運作良好 – Wen

+0

我使用版本0.20.3。該函數沒有給出錯誤,但是如果我打印了df,則NaN數據仍然存在。 – user6538642

回答

1

我認爲問題歸因於inplace=True設置。嘗試訪問切片與df.loc,然後分配ffill版數據幀片後面:

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') 
+0

謝謝,這確實有效。但是,我的原始數據幀速度非常慢(它有30 * 3000列和163000行)。雖然前向填充計算(df [ffill_list] .ffill(limit = None)大約需要3秒),但df中的分配需要5分鐘(使用df.loc [:,ffill_list] = df [ffill_list] .ffill =無))。 – user6538642

+0

@ user6538642基於loc loc的設置是更新切片的唯一方法。 –

+0

@ user6538642對不起,忽略'inplace = True',它不適用於切片,因爲inplace = True也會創建副本,不幸的是。 –