Python pandas.series.isin的潜在错误或奇怪行为

Python pandas.series.isin的潜在错误或奇怪行为,python,python-3.x,pandas,Python,Python 3.x,Pandas,我的数据库中有两个表(访问,事件) 访问具有主键访问id, 事件和页面有一列visit\u id,这是访问的外键。(一个事件行可以属于0到1次访问) 我想做的是:从事件表中筛选出所有不属于访问表的访问id。简单的任务 我有存储在pandas.DataFrame中的每个表的数据,分别是df_访问和df_事件 我执行以下操作: len(set(df_visions.visit_id)-set(df_events.visit_id))我得到的结果是1670,这符合我的预期 但当我这么做的时候 filt

我的数据库中有两个表(
访问
事件

访问具有主键
访问id
, 事件和页面有一列
visit\u id
,这是访问的外键。(一个
事件
行可以属于0到1次访问)

我想做的是:从
事件
表中筛选出所有不属于
访问
表的
访问id
。简单的任务

我有存储在
pandas.DataFrame
中的每个表的数据,分别是
df_访问
df_事件

我执行以下操作:

len(set(df_visions.visit_id)-set(df_events.visit_id))
我得到的结果是1670,这符合我的预期

但当我这么做的时候

filter_real_v = df_events.visit_id.isin(set(visits.visit_id))
filter_real_v.value_counts() # I get only True values


filter_real_v = df_events.visit_id.isin(visits.visit_id)
filter_real_v.value_counts() # I get only True values
更奇怪的是,当我使用

pd.DataFrame(df_events.visit_id).isin(real_visits)).visit_id.value_counts() #I get all False values except 8 that are True

pd.DataFrame(df_events.visit_id).isin(set(real_visits)).visit_id.value_counts() #I get all True values
这是怎么回事?我如何定义一个过滤器,它的
visit\u id
存在于
events
中,而不存在于
visions

请查找
df_事件
df_访问
csv文件以重现此错误(逗号分隔的
索引,访问id

编辑:为最小可复制代码添加代码段:

  • 下载链接中的文件,并将它们放在您选择的
    文件路径事件
    文件路径访问
  • 执行下面的代码:

  • 致以最诚挚的问候

    一切正常,您只是误解了设置操作“-”

    len(set(df\u访问.访问id)-set(df\u事件.访问id))

    将返回df_visions.visit_id的值。不在df_events.visit_id中。注意:如果df_events.visit_id的值不在df_visions.visit_id中,它们将不在这里表示。这就是集合的工作原理

    例如:

    set([1,2,3,9]) - set([9,10,11])
    
    Output:
    {1, 2, 3}
    
    注意10或11在答案中没有出现。事实上,第二盘没有一盘会赢。只有第二组中的值将从第一组中删除

    使用
    isin()
    可以有效地执行以下操作:

    visits['visit_id'].isin(df_events['visit_id'].values).value_counts()
    
    True     56071
    False     1670
    
    # Note 1670 is the exact same you got in your set operation
    
    而不是

    df_events['visit_id'].isin(visits['visit_id'].values).value_counts()
    
    True    702680
    

    你能在问题中添加数据帧(我相信不需要太长)而不是链接吗?@anky_91我试过了,但它会使我的浏览器崩溃不确定你的代码段出了什么问题,但是你也可以使用
    df.join(…,how='internal',on='visit_id'))
    how='left'
    您需要为寻求调试帮助的问题提供一个解决方案。从您的示例中,它看起来像是visions.visit\u id>events.visit\u id,1670,所以您应该期望events.visit\u id在visions.visit\u id中,从而返回所有true?是的,我搞错了
    pd.DataFrame(df\u events.visit\u id).isin(real\u visions)).visit_id.value_counts()#我得到除8个真值以外的所有假值
    pd.DataFrame(df_events.visit_id).isin(set(real_vists)).visit_id.value_counts()#我得到所有真值
    df_events['visit_id'].isin(visits['visit_id'].values).value_counts()
    
    True    702680