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然后再将值提取回列表?
您可以使用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)