我的数据库中有2个表(visits
,events
)。
访问具有主键visit_id
,
events_and_pages的列visit_id
是访问的外键。 (events
行可以属于0到1次访问)
我想做什么:从events
表中过滤掉不属于visit_id
表的所有visits
。简单的任务。
我有分别存储在pandas.DataFrame
和df_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 link,visits
和df_events
csv文件以重现此错误(逗号分隔的df_visits
)
编辑:添加代码段以减少可重复的代码:
index,visit_id
和file_path_events
中file_path_visits
最诚挚的问候
答案 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