我有两个结构如下的 DataFrame:
user_id movie_id rating
438 588 5
758 588 5
913 588 5
1024 588 5
1214 588 5
user_id movie_id rating
45 3578 3
321 3578 3
467 3578 3
758 3578 3
1024 3578 3
1381 3578 3
是否有一种 Pandas 原生方法可以在 list
中隔离出现在两个 DataFrame 中的 user_id
值?
对于上面的示例,预期输出为:
[758, 1024]
--
注意:为了帮助引导 Data Science Stack Exchange,此问题已在 datascience.stackexchange.com 上发布并提供了更多背景信息 - 如果您也是 DSSE 的用户,请帮助该网站不断发展 by answering directly there
最佳答案
您可以使用numpy.intersect1d()方法:
In [277]: np.intersect1d(a.user_id, b.user_id).tolist()
Out[277]: [758, 1024]
或pd.core.common.intersection()方法,但它似乎很慢(至少在我的笔记本上的 aa
和 bb
DataFrames [请参阅下面的设置...]):
In [307]: pd.core.common.intersection(a.user_id, b.user_id).tolist()
Out[307]: [1024, 758]
aa
DF(50K 行)和 bb
DF(60K 行)的计时:
In [294]: aa = pd.concat([a] * 10**4, ignore_index=True)
In [295]: bb = pd.concat([b] * 10**4, ignore_index=True)
In [296]: aa.shape
Out[296]: (50000, 3)
In [297]: bb.shape
Out[297]: (60000, 3)
In [298]: %timeit aa.ix[aa.user_id.isin(bb.user_id),'user_id'].tolist()
10 loops, best of 3: 41.8 ms per loop
In [299]: %timeit np.intersect1d(aa.user_id, bb.user_id).tolist()
100 loops, best of 3: 5.36 ms per loop
In [300]: %timeit pd.merge(aa, bb, on='user_id').user_id.tolist()
...
skipped
...
MemoryError:
In [308]: %timeit pd.core.common.intersection(aa.user_id, bb.user_id).tolist()
10 loops, best of 3: 52.8 ms per loop
关于Pandas - 两个不同数据框中特定列的通用值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40320298/