为了账号安全,请及时绑定邮箱和手机立即绑定

为什么“组成”系列不会导致“输入”系列的索引?

为什么“组成”系列不会导致“输入”系列的索引?

慕码人2483693 2022-06-07 19:07:47
我希望通过另一个系列索引一个系列会产生一个新系列,其索引与索引系列相同。然而,它是被索引的索引和索引系列的组合。跑步A = pandas.Series(range(3), index=list("ABC"))B = pandas.Series(list("AABBCC"), index=list("XYZWVU"))print(A[B])产量A    0A    0B    1B    1C    2C    2dtype: int64所以这里的索引形状为 ,B.index但值为A.index。相反,我原本期望 for 的索引A[B]与 相同B.index,就好像组成两个映射一样。为什么不是这样?当前设置是否有用(在我看来这没用)?有没有“正确”的方法来获得我正在寻找的东西?这个问题使某些操作变得棘手。例如,B[A[B] == 2]直观地说是如何选择 B 的条目,其值在 A 中查找时为 2。(如果 B 是一个 DataFrame 在一列中有一些对象 ID,并且我们想根据值选择 B 的行,这很有用该对象存储在辅助表中。)但是,这会产生ValueError: cannot reindex from a duplicate axis异常。如果您删除索引,这将起作用:B[(A[B] == 2).values]是使用.values正确的方法来做到这一点还是有更好的方法?
查看完整描述

1 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

在我看来,索引就是选择相应的索引。所以真的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)


查看完整回答
反对 回复 2022-06-07
  • 1 回答
  • 0 关注
  • 114 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号