我有一个dataframe 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中保留它们。我想保留大约60万个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这是可行的,但似乎笨重,而且非常缓慢。这里有更好的方法吗?在熊猫的多索引切片上,最快的方法是什么?
发布于 2019-06-13 14:48:43
使用reindex
d.reindex(pd.MultiIndex.from_frame(keep))
Out[151]:
n
id val
a 1 34
b 2 22发布于 2019-06-13 14:42:14
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个字符。你只需要牺牲对正在发生的事情的理解。
发布于 2019-06-13 14:40:57
使用loc对d进行keep索引
# d.loc[pd.MultiIndex.from_arrays([keep['id'], keep['val']]))]
d.reindex(pd.MultiIndex.from_arrays([keep['id'], keep['val']])))
n
id val
a 1 34
b 2 22哪里,
pd.MultiIndex.from_arrays([keep['id'], keep['val']])
MultiIndex(levels=[['a', 'b'], [1, 2]],
codes=[[0, 1], [0, 1]],
names=['id', 'val'])从用于筛选的MultiIndex中生成keep。
另一种选择是尝试与df.merge合并。
d.merge(keep, left_index=True, right_on=['id', 'val'])
n id val
0 34 a 1
1 22 b 2
d.merge(keep, left_index=True, right_on=['id', 'val']).set_index(['n', 'id'])
val
n id
34 a 1
22 b 2甚至,
d.join(keep.set_index(['id', 'val']), how='inner')
n
id val
a 1 34
b 2 22https://stackoverflow.com/questions/56582957
复制相似问题