简体   繁体   English

使用多个键完全连接2个词典

[英]Full join of 2 dictionaries using more than one key

I'm trying to full join two dictionaries together using 2 keys. 我正在尝试使用2个键将两个字典完全连接在一起。 It's easy to convert those dictionaries to pandas.df and then join them, but is it possible to do this skipping pandas? 将这些字典转换为pandas.df然后加入它们很容易,但是跳过熊猫有可能吗? import pandas campaigns = pd.DataFrame.from_dict(campaigns) hits = pd.DataFrame.from_dict(hits) 导入pandas广告活动= pd.DataFrame.from_dict(广告系列)点击数= pd.DataFrame.from_dict(点击数)

campaigns.merge(hits, left_on=['ga:dimension2',"ga:dimension3"], right_on=['ga:dimension2',"ga:dimension3"],
                suffixes=('_left', '_right')).to_dict('records')

sample data: 样本数据:

campaigns = [{u'ga:dimension3': u'1550492375954.8nnxmpdd', u'ga:dimension2': u'1501276805.1534759748', u'ga:source': u'(direct)', u'ga:medium': u'(none)', u'ga:hits': u'2', u'ga:keyword': u'(not set)', u'ga:campaign': u'(not set)', u'ga:adContent': u'(not set)'}, 
{u'ga:dimension3': u'1550500044503.6jpvmy2e', u'ga:dimension2': u'1817297896.1550500046', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'2', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550527874491.84pg1lz', u'ga:dimension2': u'1848009400.1550527875', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'3', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550499631285.9g1avnsc', u'ga:dimension2': u'189390412.1550499632', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'4', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'21', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550465729892.i15lr464', u'ga:dimension2': u'1915099935.1550465730', u'ga:source': u'google', u'ga:medium': u'organic', u'ga:hits': u'2', u'ga:keyword': u'(not provided)', u'ga:campaign': u'(not set)', u'ga:adContent': u'(not set)'}, 
{u'ga:dimension3': u'1550499634190.gt8w9mi', u'ga:dimension2': u'2106610830.1550499634', u'ga:source': u'(direct)', u'ga:medium': u'(none)', u'ga:hits': u'2', u'ga:keyword': u'(not set)', u'ga:campaign': u'(not set)', u'ga:adContent': u'(not set)'}, 
{u'ga:dimension3': u'1550502969449.c9oge8og', u'ga:dimension2': u'282433453.1550502969', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'4', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550479016552.y7otbq7s', u'ga:dimension2': u'false', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'2', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550498136767.12cy6eqh', u'ga:dimension2': u'false', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'6', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550518049930.ekbtg21t', u'ga:dimension2': u'false', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'6', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550524951056.e0npeo37', u'ga:dimension2': u'false', u'ga:source': u'r-bloggers.com', u'ga:medium': u'referral', u'ga:hits': u'2', u'ga:keyword': u'(not set)', u'ga:campaign': u'blogpost', u'ga:adContent': u'pic'}]

hits = [{u'ga:hits': u'1', u'ga:dimension3': u'1550502969449.c9oge8og', u'ga:dimension2': u'282433453.1550502969', u'ga:dimension1': u'2019-02-18T08:16:09.449-07:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550479016552.y7otbq7s', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T09:36:56.552+01:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550492375954.8nnxmpdd', u'ga:dimension2': u'1501276805.1534759748', u'ga:dimension1': u'2019-02-18T13:19:35.954+01:00', u'ga:pagePath': u'/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550498136767.12cy6eqh', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T14:55:36.766+01:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550465729892.i15lr464', u'ga:dimension2': u'1915099935.1550465730', u'ga:dimension1': u'2019-02-18T15:55:29.891+11:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550527874491.84pg1lz', u'ga:dimension2': u'1848009400.1550527875', u'ga:dimension1': u'2019-02-18T17:11:14.490-05:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550518049930.ekbtg21t', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T20:27:29.930+01:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550499631285.9g1avnsc', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:20:31.284+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550499631285.9g1avnsc', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:20:31.426+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550499634190.gt8w9mi', u'ga:dimension2': u'2106610830.1550499634', u'ga:dimension1': u'2019-02-18T22:20:34.189+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:22:11.668+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550524951056.e0npeo37', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T22:22:31.54+01:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:26:01.219+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:27:20.303+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:27:24.351+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550500044503.6jpvmy2e', u'ga:dimension2': u'1817297896.1550500046', u'ga:dimension1': u'2019-02-18T22:27:24.502+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}, 
{u'ga:hits': u'1', u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:30:24.440+08:00', u'ga:pagePath': u'/shiny/shinyggplot/'}]

expected output: 预期输出:

[{u'ga:dimension3': u'1550492375954.8nnxmpdd', u'ga:dimension2': u'1501276805.1534759748', u'ga:dimension1': u'2019-02-18T13:19:35.954+01:00', u'ga:source': u'(direct)', 'ga:hits_right': u'1', u'ga:pagePath': u'/', u'ga:medium': u'(none)', u'ga:keyword': u'(not set)', 'ga:hits_left': u'2', u'ga:campaign': u'(not set)', u'ga:adContent': u'(not set)'}, 
{u'ga:dimension3': u'1550500044503.6jpvmy2e', u'ga:dimension2': u'1817297896.1550500046', u'ga:dimension1': u'2019-02-18T22:27:24.502+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'2', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550527874491.84pg1lz', u'ga:dimension2': u'1848009400.1550527875', u'ga:dimension1': u'2019-02-18T17:11:14.490-05:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'3', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550499631285.9g1avnsc', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:20:31.284+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'4', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550499631285.9g1avnsc', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:20:31.426+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'4', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:22:11.668+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'21', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:26:01.219+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'21', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:27:20.303+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'21', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:27:24.351+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'21', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550500224440.t711ujn', u'ga:dimension2': u'189390412.1550499632', u'ga:dimension1': u'2019-02-18T22:30:24.440+08:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'21', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550465729892.i15lr464', u'ga:dimension2': u'1915099935.1550465730', u'ga:dimension1': u'2019-02-18T15:55:29.891+11:00', u'ga:source': u'google', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'organic', u'ga:keyword': u'(not provided)', 'ga:hits_left': u'2', u'ga:campaign': u'(not set)', u'ga:adContent': u'(not set)'}, 
{u'ga:dimension3': u'1550499634190.gt8w9mi', u'ga:dimension2': u'2106610830.1550499634', u'ga:dimension1': u'2019-02-18T22:20:34.189+08:00', u'ga:source': u'(direct)', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'(none)', u'ga:keyword': u'(not set)', 'ga:hits_left': u'2', u'ga:campaign': u'(not set)', u'ga:adContent': u'(not set)'}, 
{u'ga:dimension3': u'1550502969449.c9oge8og', u'ga:dimension2': u'282433453.1550502969', u'ga:dimension1': u'2019-02-18T08:16:09.449-07:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'4', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550479016552.y7otbq7s', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T09:36:56.552+01:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'2', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550498136767.12cy6eqh', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T14:55:36.766+01:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'6', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550518049930.ekbtg21t', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T20:27:29.930+01:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'6', u'ga:campaign': u'blogpost', u'ga:adContent': u'text'}, 
{u'ga:dimension3': u'1550524951056.e0npeo37', u'ga:dimension2': u'false', u'ga:dimension1': u'2019-02-18T22:22:31.54+01:00', u'ga:source': u'r-bloggers.com', 'ga:hits_right': u'1', u'ga:pagePath': u'/shiny/shinyggplot/', u'ga:medium': u'referral', u'ga:keyword': u'(not set)', 'ga:hits_left': u'2', u'ga:campaign': u'blogpost', u'ga:adContent': u'pic'}]

I will give it a shot. 我会试一试。 Hopefully I understood well but you want to merge on multiple keys, if the values corresponding to those keys are equal in both dicts. 希望我理解得很好,但是如果两个字典中与这些键对应的值相等,则希望合并多个键。

l1 = [
    {'a': 'not', 'b': 'sth', 'c':'good'}, 
    {'a': 'sth', 'b': 'nice', 'c': 'here'}
]
l2 = [{'a': 'sth', 'b': 'nice', 'd': 'sth else'}]

def value_gen(source, list_of_keys):
    for x in source:
        if not set(list_of_keys) - set(x):
            # Yield only what return the empty set 
            # i.e. that dict which has that list of keys
            yield x

def merge_by_keys(source1, source2, list_of_keys):
    results = []
    for x in value_gen(source1, list_of_keys):
        x_vals = [x[key] for key in list_of_keys]
        for y in value_gen(source2, list_of_keys):
            # At this point we're sure both x and y have 
            # valid signatures. We now check if the values
            # at those keys are equal.
            y_vals = [y[key] for key in list_of_keys]
            if x_vals == y_vals:
                # Fancy trick for creating a new dict 
                # which is the union of keys
                results.append({**x, **y})
    return results

merge_by_keys(l1, l2, ['a', 'b'])

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM