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

将Python dict重塑为数据帧

  •  2
  • user1718097  · 技术社区  · 7 年前

    我给了一本Python字典,它看起来像:

    myDict = {'A':['a','b','c','d','e'],
              'B':['f','g','h']}
    

      key val
    0   B   f
    1   B   g
    2   B   h
    3   A   a
    4   A   b
    5   A   c
    6   A   d
    7   A   e
    

    我不能使用标准方法将字典输入熊猫数据帧,但我已经提出了一种方法,它可以工作,但看起来很笨拙。基本上,我创建了两个包含键和值的列表,转换成另一个dict并将该dict导入到一个数据帧中。我确信我可以使用列表或字典理解来组合一些行,但是最后的命令将是不可读的。我暂时将每一行分开,以便于阅读代码。

    myDict = {'A':['a','b','c','d','e'],
              'B':['f','g','h']}
    
    # Column of keys
    keys = [[k]*len(v) for k,v in myDict.items()]
    
    # Flatten list
    keys = [item for sublist in keys for item in sublist]
    
    # Column of values
    values = [v for k,v in myDict.items()]
    
    # Flatten list
    values = [item for sublist in values for item in sublist]
    
    key = 'key'
    value = 'val'
    
    df = pd.DataFrame({key:keys,value:values})
    
    print(df)
    

    也许我已经关注这个问题太久了,但我的问题是是否有一个更简单的内置命令来实现相同的目标。

    5 回复  |  直到 7 年前
        1
  •  4
  •   a_guest    7 年前

    您可以简单地遍历dict,然后遍历每个列表:

    df = pd.DataFrame(
        data=[(k, v) for k, l in myDict.items() for v in l],
        columns=['key', 'value']
    )
    
        2
  •  1
  •   gold_cy    7 年前

    pd.DataFrame.from_dict(myDict, orient='index')
        .stack()
        .reset_index()
        .drop('level_1', axis=1)
        .rename(columns={'level_0': 'key', 0: 'value'})
    
      key value
    0   A     a
    1   A     b
    2   A     c
    3   A     d
    4   A     e
    5   B     f
    6   B     g
    7   B     h
    
        3
  •  0
  •   BENY    7 年前

    unnesting

    df=unnesting(pd.Series(myDict).to_frame(),[0]).reset_index()
    df.columns=['key','value']
    df
    Out[402]: 
      key value
    0   A     a
    1   A     b
    2   A     c
    3   A     d
    4   A     e
    5   B     f
    6   B     g
    7   B     h
    
        4
  •  0
  •   G. Anderson    7 年前

    一个在熊猫外部操作但稍微简化操作的选项:

    my_dict = {'A':['a','b','c','d','e'],
              'B':['f','g','h']}
    
    my_vals=[list(zip(k*len(v), v)) for k,v in my_dict.items()]
    
    my_rows=[item for sublist in my_vals for item in sublist ]
    
    pd.DataFrame(my_rows, columns=['key','val'])
    
        key val
    0   A   a
    1   A   b
    2   A   c
    3   A   d
    4   A   e
    5   B   f
    6   B   g
    7   B   h
    
        5
  •  0
  •   niraj    7 年前

    您也可以尝试使用:

    import pandas as pd
    
    myDict = {'A':['a','b','c','d','e'],
              'B':['f','g','h']}
    
    # Creating dataframe from the dictionary 
    df = pd.DataFrame.from_dict(myDict, orient='index')
    
    # Transpose to change keys to column names
    # stack creates level by pivoting columns
    # reset index and only select two columns
    df = df.T.stack().reset_index().iloc[:,1:]
    
    # renaming columns
    df.columns = ['key', 'value']