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