我希望一个索引被另一个序列索引会产生一个新索引,该索引索引与索引序列相同。但是,它是索引的索引和索引的Series的组合。
运行
ng new myProject
收益
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
直观地将是如何选择在A中查找时其值产生2的B条目的方法。(如果B是一列中包含某些对象ID的DataFrame,并且我们希望基于此选择B行,这将非常有用。一个对象的值存储在辅助表中。)但是,这会产生B[A[B] == 2]
异常。如果删除索引,此方法将起作用:
ValueError: cannot reindex from a duplicate axis
使用B[(A[B] == 2).values]
是正确的方法还是有更好的方法?
答案 0 :(得分:1)
我认为,索引正在选择相应的索引。因此,实际上A[B]
在index
中仍然应该有A.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)