代码之家  ›  专栏  ›  技术社区  ›  Gaurang Shah

将熊猫数据帧转换为列表的dict

  •  0
  • Gaurang Shah  · 技术社区  · 6 年前

    我正在尝试将一个3列熊猫数据帧转换为 {key:[{},{},{}]}

    不过,我真的搞不清楚。

    样本数据:

                0    1         2
    0  2019-01-21  BBB  11101110
    1  2019-01-21  CCC  11101010
    2  2019-01-21  DDD  10101110
    3  2019-01-20  BBB  11101110
    4  2019-01-20  CCC  11101010
    5  2019-01-20  DDD  10101110
    

    预期数据:

    [
        {'BBB': [{'2019-01-21': '11101110'}, {'2019-01-20': '11101110'}]}, 
        {'CCC': [{'2019-01-21': '11101010'}, {'2019-01-20': '11101010'}]}, 
        {'DDD': [{'2019-01-21': '10101110'}, {'2019-01-20': '10101110'}]}
    ]
    

    我试过了,但没用。

    a = dict(zip(df[1], [dict(zip(df[0], df[2]))]))
    print(a)
    {'BBB': {'2019-01-21': '10101110', '2019-01-20': '10101110'}}
    
    3 回复  |  直到 6 年前
        1
  •  0
  •   rafaelc    6 年前

    使用 dict & list comprehension

    [{_: [{k:v for k, v in zip(g['0'], g['2'])}] for _, g in df.groupby('1')}]
    

    哪些输出 dict 在一起

    [{'BBB': [{'2019-01-21': 11101110, '2019-01-20': 11101110}],
      'CCC': [{'2019-01-21': 11101010, '2019-01-20': 11101010}],
      'DDD': [{'2019-01-21': 10101110, '2019-01-20': 10101110}]}]
    

    [{_: [{k:v} for k, v in zip(g['0'], g['2'])]} for _, g in df.groupby('1')]
    

    哪个输出是分开的 双关语 S

    [{'BBB': [{'2019-01-21': 11101110}, {'2019-01-20': 11101110}]},
     {'CCC': [{'2019-01-21': 11101010}, {'2019-01-20': 11101010}]},
     {'DDD': [{'2019-01-21': 10101110}, {'2019-01-20': 10101110}]}]
    

    理解和常规一样有效 for 循环,但具有一些优势,例如(i)流程 “隐藏” 循环中的中间临时变量,(ii)它通常比扩展的 对于 循环,以及(iii)最重要的是,性能有几个好处,因为理解在后台使用底层C代码,并且不需要执行与这些代码相关的几个查找。 隐藏的 我提到的变量(例如查找 append , __getitem__ ETC需要相当多的额外时间)。

    展开的循环如下所示:

    final_list = []
    for _, g in df.groupby('1'):
        intermediate_list = []
        intermediate_dict = {_:intermediate_list}
        for k,v in zip(g['0'], g['2']):
            intermediate_list.append({k:v})
        final_list.append(intermediate_dict)
    
        2
  •  0
  •   BENY    6 年前

    IIUC

    df['New']=[{x : y} for x,y in zip(df['0'], df['2'])]
    df
                0    1         2                       New
    0  2019-01-21  BBB  11101110  {'2019-01-21': 11101110}
    1  2019-01-21  CCC  11101010  {'2019-01-21': 11101010}
    2  2019-01-21  DDD  10101110  {'2019-01-21': 10101110}
    3  2019-01-20  BBB  11101110  {'2019-01-20': 11101110}
    4  2019-01-20  CCC  11101010  {'2019-01-20': 11101010}
    5  2019-01-20  DDD  10101110  {'2019-01-20': 10101110}
    
    
    d=df.groupby('1').New.apply(list).to_dict()
    d
    {'BBB': [{'2019-01-21': 11101110}, {'2019-01-20': 11101110}], 
     'CCC': [{'2019-01-21': 11101010}, {'2019-01-20': 11101010}], 
     'DDD': [{'2019-01-21': 10101110}, {'2019-01-20': 10101110}]}
    

    如果你想要听写列表

    d=[{k: v} for (k, v) in d.items()()]
    
        3
  •  0
  •   gold_cy    6 年前

    你可以这样做:

    from collections import defaultdict
    
    d = defaultdict(list)
    
    for row in df.to_dict('records'):
        d[row.get('1')].append({row.get('0'): row.get('2')})
    
    defaultdict(list,
                {'BBB': [{'2019-01-21': 11101110}, {'2019-01-20': 11101110}],
                 'CCC': [{'2019-01-21': 11101010}, {'2019-01-20': 11101010}],
                 'DDD': [{'2019-01-21': 10101110}, {'2019-01-20': 10101110}]})