sve*_*esh 4 python indexing slice pandas
我有一个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)
Run Code Online (Sandbox Code Playgroud)
我还有另一个要保留的数据框,其值是id和。有60万左右的组合,和我想保留:valdidval
In [20]: keep = pd.DataFrame({'id':['a', 'b'], 'val' : [1, 2]})
Run Code Online (Sandbox Code Playgroud)
我已经通过以下方式尝试过:
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
Run Code Online (Sandbox Code Playgroud)
该方法有效,但看起来笨拙且非常慢。这里有更好的方法吗?在熊猫上切片Multindex的最快方法是什么?
loc 接受一个元组列表以引用一个 MultiIndex
d.loc[[*keep.itertuples(index=False)]]
n
id val
a 1 34
b 2 22
Run Code Online (Sandbox Code Playgroud)
做同样事情的更讨厌的方式。(实际上不是推荐)
d.loc[[*zip(*map(keep.get, keep))]]
n
id val
a 1 34
b 2 22
Run Code Online (Sandbox Code Playgroud)
优点是少了3个字符。您只需要牺牲对正在发生的事情的理解。
使用 reindex
d.reindex(pd.MultiIndex.from_frame(keep))
Out[151]:
n
id val
a 1 34
b 2 22
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
52 次 |
| 最近记录: |