如何从dtype为列表的Pandas系列中删除NaN?

alv*_*vas 6 python numpy list nan pandas

我有一个pandas.Series地方,每行的dtype是一个列表对象.例如

>>> 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
Run Code Online (Sandbox Code Playgroud)

如何删除nan每行的列表?

期望的输出是:

>>> x
0         [1, 2, 3]
1               [2]
2         [3, 4, 5]
3                []
dtype: object
Run Code Online (Sandbox Code Playgroud)

这有效:

>>> 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
Run Code Online (Sandbox Code Playgroud)

是否有比使用lambda更简单的方法,将列表转换为Series,删除NaN然后再将值提取回列表?

jez*_*ael 6

您可以使用list comprehensionwith pandas.notnull来删除NaN值:

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
Run Code Online (Sandbox Code Playgroud)

filter具有条件的另一种解决方案v!=v仅适用于NaN:

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
Run Code Online (Sandbox Code Playgroud)

谢谢你DYZ的另一个解决方案:

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