删除熊猫系列中的空列表

Posted

技术标签:

【中文标题】删除熊猫系列中的空列表【英文标题】:Remove empty lists in pandas series 【发布时间】:2015-05-19 22:59:06 【问题描述】:

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

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

附:理想情况下,我还想将系列中的元组拆分为一个两列的 DataFrame。

【问题讨论】:

存储元组就足够了,为什么还要存储列表? 系列是运行df.int_col.astype(object).combine(df.int_col2, func=it.find) 的结果,其中it 是来自bx-python 模块的IntervalTree。 (我正在尝试将区间树中的查找作为矢量化操作。) 而且由于该函数是用 C 实现的,我认为我不会很快改变它。 【参考方案1】:

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

series.str.len() == 0

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

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

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

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

【讨论】:

谢谢!想知道为什么一个系列有一个 str 以及为什么在这个 str 上调用 len 会为空列表返回 False。 我猜是str.len(),虽然是为字符串使用,只是调用了对象的底层__len__() 方法。列表经常派上用场! 这似乎不适用于最新的熊猫 @crypdick:刚刚在 ubuntu 上尝试使用 pandas 1.1.3,它似乎工作正常。您使用的是哪个版本/平台? @Alex Riley pandas==1.0.3 在 Ubuntu 上【参考方案2】:

您的 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)

【讨论】:

谢谢。该系列是使用 df.int_col.astype(object).combine(df.int_col2, func=it.find) 将 c 函数作为矢量化操作运行的结果。也许我可以围绕 it.find(start, end) 创建一个包装器,它返回此函数返回的列表中的元组。 如果您对速度感兴趣,您可能希望将此代码与普通的 Python 列表理解进行计时。这里没有做任何事情来利用 Pandas(标签对齐)或 NumPy(使用 object dtype 放弃了 NumPy 速度增益的任何可能性)。 感谢您的提示以及您在 SO 上的所有其他答案!我猜想在 DF 中做重要的是我之后想要做的计算。我认为 Pandas 矢量化操作会对我有所帮助,但也许不会。 必须将 else pd.Series() 更改为 pd.NaT【参考方案3】:

使用内置的 apply 可以按列表的长度进行过滤:

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

【讨论】:

以上是关于删除熊猫系列中的空列表的主要内容,如果未能解决你的问题,请参考以下文章

将单个项目附加到熊猫系列中的列表

如何将熊猫系列的列值转换为Python中的列表?

按字符串长度对熊猫系列中的列表进行排序

如何根据字典替换熊猫系列中的字符串组,并将值作为列表?

如何优雅地对熊猫中的一系列列表进行热编码[重复]

如何从列类型列表中删除 pandas DataFrame 中的空值