删除Pandas系列中的空列表

2024-05-16 11:12:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

另外,在理想情况下,我还希望将序列中的元组拆分为包含两列的数据帧。


Tags: infalse列表object错误条目原因out
3条回答

使用内置应用程序,可以按列表的长度进行筛选:

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

你的series状态不好——有一系列的整数元组列表 将有用的数据ints隐藏在太多的容器层中。

但是,要形成所需的数据帧,可以使用

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)

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

series.str.len() == 0

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

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

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

使用此方法时缺少默认为NaN的项。

相关问题 更多 >