我需要对表单的大型字典列表中的属性'sid'进行连接和反连接:
systolic_sex = [
{'attribute': u'bp', 'value_d': 133.0, 'value_s': u'133', 'sid': 6},
{'attribute': u'bp', 'value_d': 127.0, 'value_s': u'127', 'sid': 17},
{'attribute': u'bp', 'value_d': 121.0, 'value_s': u'121', 'sid': 18},
{'attribute': u'bp', 'value_d': 127.0, 'value_s': u'127', 'sid': 27},
{'attribute': u'bp', 'value_d': 120.0, 'value_s': u'120', 'sid': 42},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 6},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 17},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 18},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 27},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 42}
]
sex = [
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 6},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 17},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 42}
]
其中连接将在两个表单
之间通过'sid'生成匹配join = [
{'attribute': u'bp', 'value_d': 133.0, 'value_s': u'133', 'sid': 6},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 6},
{'attribute': u'bp', 'value_d': 127.0, 'value_s': u'127', 'sid': 17},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 17},
{'attribute': u'bp', 'value_d': 120.0, 'value_s': u'120', 'sid': 42},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 42}
]
并且反连接会使集合systolic_sex中的所有内容都不在性别中(在属性'sid'上匹配):
anti_join = [
{'attribute': u'bp', 'value_d': 121.0, 'value_s': u'121', 'sid': 18},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 18},
{'attribute': u'SEX', 'value_d': 0.0, 'value_s': u'M', 'sid': 27}
]
为此,我使用了Pandas的isin
功能,如下所示:
right = pd.DataFrame(sex)
left = pd.DataFrame(systolic_sex)
# get matches
matches_right = right[right.sid.isin(left.sid)]
matches_left = left[left.sid.isin(right.sid)]
# combine matched sets into single set
frames = [matches_right, matches_left]
# convert back to list of dictionaries
test = pd.concat(frames).drop_duplicates().to_dict(orient='records')
和反连接:
right = pd.DataFrame(sex)
left = pd.DataFrame(systolic_sex)
# find complement where items in left not in right
frames = left[~left.sid.isin(right.sid)]
# convert back to list of dictionaries
test = frames.to_dict(orient='records')
这项工作很精细,但是我的记录很大,这需要一段时间才能完成。
我正在寻找优化方法,尝试使用cython和numba,但是,当使用numba,cython和没有任何一个的代码的执行时间大致相同时,我做了一些挖掘并找到了{{ 1}}无论如何都使用了cython,所以这是一个死胡同。
我在Pandas库中使用了isnum
和merge
,但是输出的列名并不是我想要的格式,因此使用它会太过分了。
我的下一次尝试是尝试Numpy索引,沿着这个帖子的行:efficiently-select-rows-that-match-one-of-several-values-in-pandas-dataframe,但我不确定如何实现我的特定用例(任何指针都是最受欢迎的)。