代码之家  ›  专栏  ›  技术社区  ›  user3685918

如何将数据帧转换成集合字典?

  •  1
  • user3685918  · 技术社区  · 4 年前

    我有一个 dataframe 想把 dictionary 包括 set .

    具体地说,我的数据帧和我想要做的如下:

        month   date
    0   JAN       1
    1   JAN       1
    2   JAN       1
    3   FEB       2
    4   FEB       2
    5   FEB       3
    6   MAR       1
    7   MAR       2
    8   MAR       3
    
    

    我的目标:

    dict = {'JAN' : {1}, 'FEB' : {2,3}, 'MAR' : {1,2,3}}
    

    实际上,数据量很大, 因此,我想知道任何提示或其他有效(更快)的方法,使它。

    import pandas as pd
    df = pd.DataFrame({'month' : ['JAN','JAN','JAN','FEB','FEB','FEB','MAR','MAR','MAR'],
                        'date'  : [1, 1, 1, 1, 2, 3, 1, 2, 3]})
    df_list = df.values.tolist()
    
    monthSet = ['JAN','FEB','MAR']
    inst_id_dict = {}
    for i in df_list:
        monStr = i[0]
        if monStr in monthSet:
            inst_id = i[1]
            inst_id_dict.setdefault(monStr, set([])).add(inst_id)
    
    1 回复  |  直到 4 年前
        1
  •  3
  •   cs95 abhishek58g    4 年前

    让我们尝试对“month”列进行分组,然后按 GroupBy.unique :

    df.groupby('month', sort=False)['date'].unique().map(set).to_dict()
    #  {'JAN': [1], 'FEB': [2, 3], 'MAR': [1, 2, 3]}
    

    或者,如果你喜欢一本集合字典,用 Groupby.agg :

    df.groupby('month', sort=False)['date'].agg(set).to_dict()
    # {'JAN': {1}, 'FEB': {2, 3}, 'MAR': {1, 2, 3}}
    

    另一个想法是迭代地构建dict(不要担心,尽管使用循环,这可能比 groupby 选项):

    out = {}
    for m, d in df.drop_duplicates(['month', 'date']).to_numpy():
         out.setdefault(m, set()).add(d)
    
    out
    # {'JAN': {1}, 'FEB': {2, 3}, 'MAR': {1, 2, 3}}