Как заполнить значения 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()
), и затем заключите его в список: значение, которое вы присваиваете это 2Д массив (столбец 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))
создать функцию, которая проверяет ваше состояние, если нет, она возвращает пустой список/пустой набор и т. д.
затем примените эту функцию к переменной, но также назначив новую вычисляемую переменную старой или новой переменной, если хотите.
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))