Pandas—两个不同数据帧中特定列的公共值

Pandas—两个不同数据帧中特定列的公共值,pandas,dataframe,Pandas,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

我有两个数据帧,结构如下:

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
是否有办法在
列表中隔离出现在两个数据帧中的
用户id
的值

对于上述示例,预期输出为:

[758, 1024]
--

注意:为了帮助引导Data Science Stack Exchange,此问题已在datascience.stackexchange.com上以更多背景发布-如果您也是DSSE的用户,请帮助此网站成长

您可以使用:

另一个解决方案包括:

您可以使用以下方法:

或方法,但它似乎很慢(至少在我的笔记本上,
aa
bb
数据帧[请参见下面的设置…]):

定时对于
aa
DF(50K行)和
bb
DF(60K行):


而你省略了你的第一个解决方案——你能增加时间吗?@jezrael,它挂在我的笔记本上:)没问题。顺便说一句,有趣的是合并失败:),而numpy解决方案显然是最快的关于便条:@ayhan这只是为dsse做广告的一种方式:)--如果我只是想得到好的答案,我只会把它贴在上面
print (df1.user_id.isin(df2.user_id))
0    False
1     True
2    False
3     True
4    False
Name: user_id, dtype: bool

print (df1[df1.user_id.isin(df2.user_id)])
   user_id  movie_id  rating
1      758       588       5
3     1024       588       5

print (df1.ix[df1.user_id.isin(df2.user_id),'user_id'])
1     758
3    1024
Name: user_id, dtype: int64

print (df1.ix[df1.user_id.isin(df2.user_id),'user_id'].tolist())
[758, 1024]
print (pd.merge(df1,df2, on='user_id').user_id.tolist())
[758, 1024]
In [277]: np.intersect1d(a.user_id, b.user_id).tolist()
Out[277]: [758, 1024]
In [307]: pd.core.common.intersection(a.user_id, b.user_id).tolist()
Out[307]: [1024, 758]
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