2015-10-18 210 views
12

這是我的數據框:如何在pandas中用空列表[]填充數據幀Nan值?

  date       ids 
0  2011-04-23 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 
1  2011-04-24 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 
2  2011-04-25 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 
3  2011-04-26 Nan 
4  2011-04-27 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 
5  2011-04-28 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,... 

我想替換Nan用[]。怎麼做? Fillna([])不起作用。我甚至嘗試replace(np.nan, [])但它給錯誤:

TypeError('Invalid "to_replace" type: \'float\'',) 
+0

你是如何在'ids'中獲得列表的? –

+1

空列表不能分配,會'df.ix [df ['ids']。isnull(),'ids'] = set()'set work? – Zero

+0

請注意,這是如此困難的一個原因是因爲你不是真的要在數據框單元中存儲非標量值。你可以做到這一點,它有時可以用作中間步驟(有許多內置的方法可以生成列表作爲元素),但目前還沒有很好的支持。 – DSM

回答

7

你可先用loc定位,在ids列有nan,並且所有行,然後通過使用at其值設置爲空列表中的這些行中循環:

for row in df.loc[df.ids.isnull(), 'ids'].index: 
    df.at[row, 'ids'] = [] 

>>> df 
     date            ids 
0 2011-04-23 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
1 2011-04-24 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
2 2011-04-25 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
3 2011-04-26            [] 
4 2011-04-27 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
5 2011-04-28 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] 
+0

很難找到這樣的解決方案。我真的很感激。 +1 – ALH

0

不分配:

1)假設我們只漂浮在我們的數據幀整數

import math 
df.apply(lambda x:x.apply(lambda x:[] if math.isnan(x) else x)) 

2)對於任何數據幀

import math 
def isnan(x): 
    if isinstance(x, (int, long, float, complex)) and math.isnan(x): 
     return True 

df.apply(lambda x:x.apply(lambda x:[] if isnan(x) else x)) 
0

很多頭部劃傷後,我發現這個方法應該是最有效的(無循環,無適用),剛分配到切片:

isnull = df.ids.isnull() 

df.loc[isnull, 'ids'] = [ [[]] * isnull.sum() ] 

訣竅是構建你的權利的大小(isnull.sum())的[]列表,然後附上它在一個列表:您要分配的值是2D包含空列表作爲元素的數組(1列,isnull.sum()行)。

3

我的做法是類似於@ hellpanderrr的,但對於名單的煩躁,而不是測試,而不是使用isnan

df['ids'] = df['ids'].apply(lambda d: d if isinstance(d, list) else []) 

我使用pd.isnull(或pd.notnull),但最初試圖給出一個列表時,它返回每個元素的無效性。

0

listfillna方法中不受支持,但您可以使用dict代替。

df.fillna({}) 
-1

創建檢查你的條件的功能,如果沒有,則返回一個空列表/空集等

然後該功能應用於變量,也賦予新計算的變量老一個或一個新的變量,如果你願意。

aa=pd.DataFrame({'d':[1,1,2,3,3,np.NaN],'r':[3,5,5,5,5,'e']}) 


def check_condition(x): 
    if x>0: 
     return x 
    else: 
     return list() 

aa['d]=aa.d.apply(lambda x:check_condition(x))