Подтвердить что ты не робот

Как заполнить данные 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\'',)
4b9b3361

Ответ 1

Вы можете сначала использовать 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]

Ответ 2

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

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

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

Ответ 3

Без назначений:

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

Ответ 4

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

isnull = df.ids.isnull()

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

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

Ответ 5

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

df.fillna({})

Ответ 6

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

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

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