python - pandas:使用许多索引切片 Multiindex
问题描述
我有一个d
关于100,000,000
行和3
列的数据框。它看起来像这样:
import pandas as pd
In [17]: d = pd.DataFrame({'id': ['a', 'b', 'c', 'd', 'e'], 'val': [1, 2, 3, 4, 5], 'n': [34, 22, 95, 86, 44]})
In [18]: d.set_index(['id', 'val'], inplace = True)
我有另一个数据框,其值为id
并且val
我想保留在d
. 我想保留大约 600,000 种id
和的组合:val
In [20]: keep = pd.DataFrame({'id':['a', 'b'], 'val' : [1, 2]})
我已经通过以下方式进行了尝试:
In [21]: keep.set_index(['id', 'val'], inplace = True)
In [22]: d.loc[d.index.isin(keep.index), :]
Out [22]:
n
id val
a 1 34
b 2 22
这可行,但看起来很笨重而且很慢。这里有更好的方法吗?在 Pandas 中对 Multindex 进行切片的最快方法是什么?
解决方案
loc
获取一个元组列表来引用MultiIndex
d.loc[[*keep.itertuples(index=False)]]
n
id val
a 1 34
b 2 22
做同样事情的更令人讨厌的方式。(实际上不是推荐)
d.loc[[*zip(*map(keep.get, keep))]]
n
id val
a 1 34
b 2 22
优点是少了3个字符。你只需要牺牲对正在发生的事情的理解。
推荐阅读
- laravel - 当数据库中没有数据时,无法显示警报“无数据”
- wordpress - WooCommerce - 删除具有变化的产品页面上的最高价格
- css - 如何使用 flexbox 将内容包含在网格中?
- cordova - 在 iOS11 上首次使用 cordova-plugin-camera (Image Picker) 时未请求许可
- arrays - Go 中的数组是按值计算的?
- javascript - 类属性内的 Ajax 调用
- javascript - 使用带three.js的A-frame会影响three.js吗?
- javascript - Javascript window.onload 不使用 Chart.js 和 Flask 显示图表
- python - for 循环不会继续下一次迭代 gspread
- orientdb - 检查 OrientDB 是否处于备份模式/