设置大型词典列表的操作

时间:2016-01-31 02:29:58

标签: python numpy pandas optimization cython

我需要对表单的大型字典列表中的属性'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库中使用了isnummerge,但是输出的列名并不是我想要的格式,因此使用它会太过分了。

我的下一次尝试是尝试Numpy索引,沿着这个帖子的行:efficiently-select-rows-that-match-one-of-several-values-in-pandas-dataframe,但我不确定如何实现我的特定用例(任何指针都是最受欢迎的)。

0 个答案:

没有答案