对不确定数量的Pandas序列进行元素级逻辑与操作

4 投票
1 回答
2630 浏览
提问于 2025-04-18 05:03

假设我有一个包含 n 个 Pandas Series 的列表(n 的值在函数中是未知的),这些 Series 代表逻辑布尔索引,我想要对它们进行逐个元素的与运算(AND),然后用得到的 Series 来索引一个 DataFrame。

目前我使用的是 np.logical_and(x1,x2) 和一个 for 循环来实现这个功能。我尝试过使用 itertools.izipzip,但效果不太好。Pandas 的 Series 对这两个方法似乎不太友好。

我一直在思考,为什么这样做会得到一个布尔 Series,但在执行时却出现了 IndexingError: Unalignable boolean Series key provided 的错误。

有没有什么想法?我觉得既然这些是 ndarray,应该有一种明显简单的方法来实现这个操作。

1 个回答

8

假设我理解你的意思,你可以使用 logical_and.reduce。从一组 Series 开始:

>>> ss = [pd.Series([ True, False,  True, False,  True]), pd.Series([False,  True,  True, False, False]), pd.Series([False, False,  True, False,  True]), pd.Series([False,  True,  True, False, False]), pd.Series([ True,  True,  True,  True, False])]

看起来会像这样:

>>> pd.DataFrame(ss)
       0      1     2      3      4
0   True  False  True  False   True
1  False   True  True  False  False
2  False  False  True  False   True
3  False   True  True  False  False
4   True   True  True   True  False

[5 rows x 5 columns]

如果这是一个数据框,你可以在列之间进行归约操作:

>>> np.logical_and.reduce(ss)
array([False, False,  True, False, False], dtype=bool)

或者如果你想反向操作,可以传入 axis=1

记得你也可以使用 anyall,比如:

>>> df = pd.DataFrame(ss)
>>> df.all()
0    False
1    False
2     True
3    False
4    False
dtype: bool

撰写回答