2016-11-07 48 views
3

考慮pd.DataFramedf填充多個失蹤系列值的值

df = pd.DataFrame([ 
     [np.nan, 1,  np.nan], 
     [2,  np.nan, np.nan], 
     [np.nan, np.nan, 3  ], 
    ], list('abc'), list('xyz')) 

df 

enter image description here

pd.Seriess

s = pd.Series([10, 20, 30], list('abc')) 

如何填寫遺漏值df基於的s索引和df

索引。例如s相應的值:

  • df.loc['c', 'x']NaN
  • s.loc['c']30

預期的結果
enter image description here

回答

4

熊貓處理這個列的基礎上沒有問題。假設我們有一個不同的s

s = pd.Series([10, 20, 30], ['x', 'y', 'z']) 

那麼我們就可以

df.fillna(s) 

     x  y  z 
a 10.0 1.0 30.0 
b 2.0 20.0 30.0 
c 10.0 20.0 3.0 

但是,這不是你想要的。使用您的s

s = pd.Series([10, 20, 30], ['a', 'b', 'c']) 

然後df.fillna(s)什麼都不做。但我們知道,它適用於列,所以:

df.T.fillna(s).T 

     x  y  z 
a 10.0 1.0 10.0 
b 2.0 20.0 20.0 
c 30.0 30.0 3.0 
2

這裏有一個NumPy的方法 -

mask = np.isnan(df.values) 
df.values[mask] = s[s.index.searchsorted(df.index)].repeat(mask.sum(1)) 

採樣運行 -

In [143]: df 
Out[143]: 
    x y z 
a NaN 1.0 NaN 
b 2.0 NaN NaN 
d 4.0 NaN 7.0 
c NaN NaN 3.0 

In [144]: s 
Out[144]: 
a 10 
b 20 
c 30 
d 40 
e 50 
dtype: int64 

In [145]: mask = np.isnan(df.values) 
    ...: df.values[mask] = s[s.index.searchsorted(df.index)].repeat(mask.sum(1)) 
    ...: 

In [146]: df 
Out[146]: 
     x  y  z 
a 10.0 1.0 10.0 
b 2.0 20.0 20.0 
d 4.0 40.0 7.0 
c 30.0 30.0 3.0 

請注意,如果s的索引值沒有排序,我們需要使用額外的參數sortersearchsorted

2

另一種方式:

def fillnull(col): 
    col[col.isnull()] = s[col.isnull()] 
    return col 

df.apply(fillnull) 

注意,它比@布賴恩的方式(每環9ms的每對環路爲1.5ms我的電腦上)

效率較低