我有一个很长的系列如下:
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。
答案 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]