2017-01-04 13 views
5

私はpandas.Seriesを持っています。各行のdtypeはリストオブジェクトです。例えば。私は行ごとのリストにnanを削除するにはどうすればよいdtypeがリストであるPandasシリーズからNaNを削除するにはどうすればよいですか?

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

所望の出力は次のようになります。

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

これは動作します:

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

は、ラムダを使用してシリーズをリストに変換し、NaNを落とした後、抽出よりも簡単な方法はあります値は再びリストに戻りますか?

答えて

5

あなたはpandas.notnulllist comprehensionを使用するためのNaN値は削除することができます。ここで、v!=vだけNaNための条件でfilter

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 

別の解決策を:

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 

別の解決策をあなたにDYZありがとう:

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'と' IF-else'条件はありません、filter' 'に簡略化されることができるはずですか? – alvas

+0

はい、あなたは正しいです。私は解決策を追加する。 – jezrael

+0

@jezraelただ1つの 'lambda'を持つソリューション:' x.apply(lambda y:list(filter(np.isfinite、y))) '。 – DyZ

1

リスト内包とシンプルnumpyソリューション:

pd.Series([np.array(e)[~np.isnan(e)] for e in x.values]) 
関連する問題