使用包含列表数据类型的 Pandas Series,如何为特定条件选择值?

3

我实际上知道很多在Pandas Dataframe和Series中操作dtype为float类型的方法,但是如果要处理包含dtype为list的Series,该怎么做呢?

比如说,我想要:

series = pd.Series([[1,2],[2,3,4],[4,6]])

series 就像:

0    [1, 2]
1    [2, 3, 4]
2    [4, 6]
dtype: object

我希望得到长度大于2的行,实际上只有第1行符合条件。我尝试了:

series[len(series) > 2]

以及

series[series.apply(lambda x : len(x) > 1)]

两者都无法工作。


1
请检查 series[series.map(len) > 2],您的解决方案 series[series.apply(lambda x : len(x) > 1)] 也应该可以工作,只需将 > 1 替换为 > 2 即可。 - Shubham Sharma
谢谢,我再试了第二种方法,成功了。 - Bob liao
2个回答

2
列表列支持.str访问器方法,因为它们本质上是对象。请尝试。
series[series.str.len() > 2]
 
1    [2, 3, 4]
dtype: object

如果需要满足条件的行的索引值,我们可以通过索引过滤来实现:
series.index[series.str.len() > 2]
# Int64Index([1], dtype='int64')

或者,如果您想要删除长度大于2的行,您可以使用布尔索引进行过滤:

series[series.str.len() <= 2]

0    [1, 2]
2    [4, 6]
dtype: object

请注意,您的第一个解决方案不合理,因为条件是标量,但是如果您的列也有NaN,则应用代码将使用len(x) > 2,而.str解决方案会优雅地处理这种情况。

如果你有时间,可以加入这个房间吗?我想讨论一下在pandas版本1.2.x中的一个bug。 :) - Shubham Sharma
谢谢您的回复。我的第一个解决方案适用于 dtype 类型类似于 float 的情况,但对于列表对象则无效。 - Bob liao

0

在此输入图像描述 Series通常在str中使用,因为其具有访问方法。这就是为什么Series使用str的原因。

series[series.apply(lambda x :len(x) > 2)][enter image description here][1]

是的,很好。我想再补充一件事:直接访问带有条件选择系列的行可能会导致关键错误(索引未重置),我认为最好的方法是: series[series.apply(lambda x :len(x) > 2)].iloc[1] - Bob liao
当然可以。你的回答很好,而且表达得更好。谢谢。 - Zubair Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接