为什么“撰写”系列不产生“输入”系列的索引?

时间:2019-09-26 14:16:55

标签: python pandas

我希望一个索引被另一个序列索引会产生一个新索引,该索引索引与索引序列相同。但是,它是索引的索引和索引的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] 是正确的方法还是有更好的方法?

1 个答案:

答案 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)