首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >删除pandas系列中的空列表

删除pandas系列中的空列表
EN

Stack Overflow用户
提问于 2015-03-17 21:30:07
回答 3查看 12.6K关注 0票数 8

我有一个很长的系列,如下所示:

代码语言:javascript
复制
series = pd.Series([[(1,2)],[(3,5)],[],[(3,5)]])

In [151]: series
Out[151]:
0    [(1, 2)]
1    [(3, 5)]
2          []
3    [(3, 5)]
dtype: object

我想删除列表为空的所有条目。由于某些原因,布尔索引不起作用。

下面的两个测试都给出了相同的错误:

代码语言:javascript
复制
series == [[(1,2)]]
series == [(1,2)]

ValueError: Arrays were different lengths: 4 vs 1

这非常奇怪,因为在下面的简单示例中,索引的工作原理与上面一样:

代码语言:javascript
复制
In [146]: pd.Series([1,2,3]) == [3]
Out[146]:
0    False
1    False
2     True
dtype: bool

另外,理想情况下,我还希望将该系列中的元组拆分为两列的DataFrame。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-17 21:40:57

您可以使用str.len()检查列表是否为空

代码语言:javascript
复制
series.str.len() == 0

然后使用这个布尔序列删除包含空列表的行。

如果您的每个条目都是一个包含两个元组的列表(否则为空),则可以通过使用两次str访问器来创建一个两列的DataFrame (一次用于选择列表的第一个元素,然后访问元组的元素):

代码语言:javascript
复制
pd.DataFrame({'a': series.str[0].str[0], 'b': series.str[0].str[1]})

对于此方法,缺少的条目默认为NaN

票数 18
EN

Stack Overflow用户

发布于 2015-03-17 21:43:23

您的series处于一种糟糕的状态--拥有一系列int的元组列表会将有用的数据int埋没在太多的容器层中。

但是,要形成所需的DataFrame,您可以使用

代码语言:javascript
复制
df = series.apply(lambda x: pd.Series(x[0]) if x else pd.Series()).dropna()

哪一项会产生

代码语言:javascript
复制
   0  1
0  1  2
1  3  5
2  3  5

一种更好的方法是避免完全构建格式错误的series,直接从数据形成df

代码语言:javascript
复制
data = [[(1,2)],[(3,5)],[],[(3,5)]]
data = [pair for row in data for pair in row]
df = pd.DataFrame(data)
票数 4
EN

Stack Overflow用户

发布于 2017-08-30 23:58:00

使用内置应用,您可以根据列表的长度进行过滤:

代码语言:javascript
复制
series = pd.Series([[(1,2)],[(3,5)],[],[(3,5)]])
series = series[series.apply(len) > 0]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29100380

复制
相关文章

相似问题

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