删除pandas系列中的空列表

时间:2015-03-17 13:30:07

标签: python list pandas dataframe

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

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

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

以下测试都给出了同样的错误:

series == [[(1,2)]]
series == [(1,2)]

ValueError: Arrays were different lengths: 4 vs 1

这很奇怪,因为在下面的简单示例中,索引的工作方式与上面类似:

In [146]: pd.Series([1,2,3]) == [3]
Out[146]:
0    False
1    False
2     True
dtype: bool

P.S。理想情况下,我想将系列中的元组拆分为两列的DataFrame。

3 个答案:

答案 0 :(得分:12)

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

series.str.len() == 0

然后使用此布尔系列删除包含空列表的行。

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

pd.DataFrame({'a': series.str[0].str[0], 'b': series.str[0].str[1]})

使用此方法,缺少条目默认为NaN

答案 1 :(得分:4)

您的series状态不佳 - 拥有一系列整数元组列表 在有太多容器层内埋没有用数据,即整数。

但是,要构建所需的DataFrame,您可以使用

df = series.apply(lambda x: pd.Series(x[0]) if x else pd.Series()).dropna()

产生

   0  1
0  1  2
1  3  5
2  3  5

更好的方法是避免完全构建格式错误的series 直接从数据中填写df

data = [[(1,2)],[(3,5)],[],[(3,5)]]
data = [pair for row in data for pair in row]
df = pd.DataFrame(data)

答案 2 :(得分:2)

使用内置的应用程序,您可以按列表的长度进行过滤:

series = pd.Series([[(1,2)],[(3,5)],[],[(3,5)]])
series = series[series.apply(len) > 0]