2015-10-18 3 views
12

Это мой dataframe:Как заполнить dataframe Значения Nan с пустым списком [] в pandas?

  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, чтобы найти все строки, которые имеют nan в ids колонки, а затем перебрать эти строки, используя 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) Предположим, что мы имеем только поплавки и целые числа в нашем dataframe

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

2) Для любого dataframe

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), но, когда дан список, который возвращает null-ness каждого элемента.

0

list не поддерживается в fillna способе, но вместо этого вы можете использовать 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)) 
Смежные вопросы