Как заполнить значения 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'',)

6 ответов


можно использовать loc, чтобы найти все строки, которые имеют 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]

мой подход похож на @hellpanderrr, но вместо этого проверяет список, а не использует isnan:

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

Я изначально пытался использовать pd.isnull (или pd.notnull) но, когда задан список, который возвращает null-ness каждого элемента.


после большого количества царапин на голове я нашел этот метод, который должен быть наиболее эффективным (без цикла, без применения), просто назначая срез:

isnull = df.ids.isnull()

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

фишка в том, чтобы построить свой список [] нужного размера (isnull.sum()), и затем заключите его в список: значение, которое вы присваиваете это массив (столбец 1, isnull.sum() строки), содержащие пустые списки в качестве элементов.


без назначения:

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))

list Не поддерживается в fillna способ, но вы можете использовать .

df.fillna({})

создать функцию, которая проверяет ваше состояние, если нет, она возвращает пустой список/пустой набор и т. д.

затем примените эту функцию к переменной, но также назначив новую вычисляемую переменную старой или новой переменной, если хотите.

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))