首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从数据类型为列表的熊猫系列中删除NaN?

如何从数据类型为列表的熊猫系列中删除NaN?
EN

Stack Overflow用户
提问于 2017-01-04 14:21:40
回答 2查看 2.3K关注 0票数 6

我有一个pandas.Series,其中每一行的数据类型都是一个列表对象。例如。

代码语言:javascript
复制
>>> 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

如何删除每行列表中的nan

期望的输出将是:

代码语言:javascript
复制
>>> x
0         [1, 2, 3]
1               [2]
2         [3, 4, 5]
3                []
dtype: object

这是可行的:

代码语言:javascript
复制
>>> 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

有没有比使用lambda更简单的方法,将列表转换为Series,删除NaN,然后将值重新提取到列表中?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-04 14:26:16

您可以结合使用list comprehensionpandas.notnull来删除NaN值:

代码语言:javascript
复制
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

filter的另一种解决方案,条件是v!=v仅适用于NaN

代码语言:javascript
复制
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提供的另一种解决方案:

代码语言:javascript
复制
print (x.apply(lambda y: list(filter(np.isfinite, y))))
0    [1, 2, 3]
1          [2]
2    [3, 4, 5]
3           []
dtype: object
票数 6
EN

Stack Overflow用户

发布于 2017-01-04 14:31:45

一个支持列表理解的简单numpy解决方案:

代码语言:javascript
复制
pd.Series([np.array(e)[~np.isnan(e)] for e in x.values])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41457408

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档