2017-01-04 15 views
5

Her satırın dtype bir liste nesnesi olduğu bir pandas.Series var. Örneğin.Nasıl dtype bir liste olduğu bir Pandas Series NaN kaldırmak için?

>>> import numpy as np 
>>> import pandas as pd 
>>> x = pd.Series([[1,2,3], [2,np.nan], [3,4,5,np.nan], [np.nan]]) 
>>> x 
0   [1, 2, 3] 
1   [2, nan] 
2 [3, 4, 5, nan] 
3    [nan] 
dtype: object 

Nasıl her satır için listelerde nan kaldırırım?

istenen çıkış olacaktır:

>>> x 
0   [1, 2, 3] 
1    [2] 
2   [3, 4, 5] 
3    [] 
dtype: object 

çalışır:

>>> x.apply(lambda y: pd.Series(y).dropna().values.tolist()) 
0   [1, 2, 3] 
1    [2.0] 
2 [3.0, 4.0, 5.0] 
3     [] 
dtype: object 

, bir dizi listesine dönüştürülmesi, lambda kullanılarak NaN bırakarak ve daha sonra ekstre daha basit bir yöntem var mı değerler tekrar bir listeye mi dönüyor?

cevap

5

çıkartma NaN değerleri pandas.notnull ile list comprehension kullanabilirsiniz:

print (x.apply(lambda y: [a for a in y if pd.notnull(a)])) 
0 [1, 2, 3] 
1   [2] 
2 [3, 4, 5] 
3   [] 
dtype: object 

Başka bir çözüm filter ile koşulu ile nerede v!=v sadece NaN için:

print (x.apply(lambda a: list(filter(lambda v: v==v, a)))) 
0 [1, 2, 3] 
1   [2] 
2 [3, 4, 5] 
3   [] 
dtype: object 

başka bir çözüm için teşekkür DYZ ederiz:

print (x.apply(lambda y: list(filter(np.isfinite, y)))) 
0 [1, 2, 3] 
1   [2] 
2 [3, 4, 5] 
3   [] 
dtype: object 
+0

'lambda' ve' if-else' koşullar gerekir hayır, filter' 'içine basitleştirilmiş edilecek? – alvas

+0

Evet, haklısınız. Çözüm ekliyorum. – jezrael

+0

Sadece bir “lambda”: x.apply (lambda y: list (filter (np.isfinite, y))) ile jezrael çözümü. – DyZ

1

liste anlayışı ile basit numpy çözeltisi:

pd.Series([np.array(e)[~np.isnan(e)] for e in x.values]) 
İlgili konular