对不确定数量的Pandas序列进行元素级逻辑与操作
假设我有一个包含 n 个 Pandas Series 的列表(n 的值在函数中是未知的),这些 Series 代表逻辑布尔索引,我想要对它们进行逐个元素的与运算(AND),然后用得到的 Series 来索引一个 DataFrame。
目前我使用的是 np.logical_and(x1,x2)
和一个 for 循环来实现这个功能。我尝试过使用 itertools.izip
或 zip
,但效果不太好。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
。
记得你也可以使用 any
和 all
,比如:
>>> df = pd.DataFrame(ss)
>>> df.all()
0 False
1 False
2 True
3 False
4 False
dtype: bool