为什么“合成”系列不会产生“输入”系列的索引?

2024-09-30 18:21:28 发布

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

我希望一个系列对另一个系列进行索引将产生一个索引与索引系列相同的新系列。然而,它是索引的索引和索引系列的组合

运行

A = pandas.Series(range(3), index=list("ABC"))
B = pandas.Series(list("AABBCC"), index=list("XYZWVU"))

print(A[B])

屈服

A    0
A    0
B    1
B    1
C    2
C    2
dtype: int64

所以这里的索引的形状是B.index,但是值是A.index

相反,我希望A[B]的索引将与B.index相同,就像组成两个映射一样。为什么不是这样?当前设置是否有用(在我看来,它是无用的)?有没有一种“正确”的方式来获得我想要的东西

这个问题使得某些操作变得棘手。比如说,

B[A[B] == 2]

直观地说,当在A中查找B的条目时,如何选择其值为2的条目(如果B是一个数据帧,在一列中有一些对象ID,并且我们希望根据存储在辅助表中的该对象的值来选择B的行,那么这很有用。)但是这会产生一个ValueError: cannot reindex from a duplicate axis异常。如果删除索引,则此操作有效:

B[(A[B] == 2).values]

使用.values是正确的方法还是有更好的方法


Tags: 对象方法pandasindex条目rangelistseries
1条回答
网友
1楼 · 发布于 2024-09-30 18:21:28

在我看来,索引就是选择相应的索引。所以实际上A[B]A.index中仍然应该有index

如果您想映射这些值,则使用map。而且速度似乎也更快:

%timeit -n 1000 B.map(A)
# 196 µs ± 6.92 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -n 1000 A[B]
# 384 µs ± 5.54 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

以及:

%timeit -n 1000 B[B.map(A).eq(2)]
# 624 µs ± 38.3 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit -n 1000 B[A[B].eq(2).values]
#779 µs ± 7.51 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

相关问题 更多 >