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

时间:2019-05-29 17:22:32

标签: python python-3.x pandas

我的数据库中有2个表(visitsevents)。

访问具有主键visit_id, events_and_pages的列visit_id是访问的外键。 (events行可以属于0到1次访问)

我想做什么:从events表中过滤掉不属于visit_id表的所有visits。简单的任务。

我有分别存储在pandas.DataFramedf_visits中的每个表的数据

我执行以下操作:

df_events我得到的结果是1670,符合我的期望。

但是当我这样做

len(set(df_visits.visit_id) - set(df_events.visit_id))

即使我使用

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_id但不存在events中的过滤器?

请找到in this linkvisitsdf_events csv文件以重现此错误(逗号分隔的df_visits

编辑:添加代码段以减少可重复的代码:

  1. 下载链接中的文件,并将其放在您选择的index,visit_idfile_path_events
  2. 执行以下代码:
file_path_visits

最诚挚的问候

1 个答案:

答案 0 :(得分:1)

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

len(set(df_visits.visit_id) - set(df_events.visit_id))

将返回df_events.visit_id中的 df_visits.visit_id 的值。 注意:如果df_visits.visit_id中的值不在df_visits.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