【问题标题】:Combine multiple dictionaries into one pandas dataframe in long format将多个字典以长格式组合成一个 pandas 数据框
【发布时间】:2019-05-05 05:07:39
【问题描述】:

我有几个字典设置如下:

Dict1 = {'Orange': ['1', '2', '3', '4']}
Dict2 = {'Red': ['3', '4', '5']}

我希望输出是一个组合数据框:

| Type | Value |
|--------------|
|Orange|   1   |
|Orange|   2   |
|Orange|   3   |
|Orange|   4   |
| Red  |   3   |
| Red  |   4   |
| Red  |   5   |

我尝试将所有内容都拆分出来,但我只在这个数据框中得到了 Dict2。

mydicts = [Dict1, Dict2]
for x in mydicts:
    for k, v in x.items():
        df = pd.DataFrame(v)
        df['Type'] = k

【问题讨论】:

    标签: python pandas dictionary dataframe


    【解决方案1】:

    一个选项是使用pd.concat

    pd.concat(map(pd.DataFrame, mydicts), axis=1).melt().dropna()
    
      variable value
    0   Orange     1
    1   Orange     2
    2   Orange     3
    3   Orange     4
    4      Red     3
    5      Red     4
    6      Red     5
    

    如果性能很重要,您可以使用 DataFrame.from_dictmelt 初始化单个 DataFrame:

    pd.DataFrame.from_dict({**Dict1, **Dict2}, orient='index').T.melt().dropna()
      variable value
    0   Orange     1
    1   Orange     2
    2   Orange     3
    3   Orange     4
    4      Red     3
    5      Red     4
    6      Red     5
    

    或者,使用stack 而不是melt(稍微慢一点,只是为了完整性):

    res = (pd.DataFrame.from_dict({**Dict1, **Dict2}, orient='index').T
             .stack()
             .reset_index(level=1)
             .sort_values('level_1'))
    res.columns = ['Type', 'Value']
    
    print(res)
         Type Value
    0  Orange     1
    1  Orange     2
    2  Orange     3
    3  Orange     4
    0     Red     3
    1     Red     4
    2     Red     5
    

    字典解包语法适用于python3.6。在旧版本上,将{**d1, **d2} 替换为{k: v for d in mydicts for k, v in d.items()}

    【讨论】:

    • 有没有办法遍历第二个示例中的字典而不是单独命名它们?
    • @ATCH_torn 是的,请参阅我刚刚添加的脚注。
    【解决方案2】:

    stack之后,就变成了unnest的问题

    s=pd.DataFrame(mydicts).stack().reset_index(level=1)
    unnesting(s,[0])
    Out[829]: 
       0 level_1
    0  1  Orange
    0  2  Orange
    0  3  Orange
    0  4  Orange
    1  3     Red
    1  4     Red
    1  5     Red
    

    【讨论】:

      【解决方案3】:

      理解

      pd.DataFrame(
          [(t, v)
           for t, V in {**Dict1, **Dict2}.items()
           for v in V],
          columns=['Type', 'Value']
      )
      
           Type Value
      0  Orange     1
      1  Orange     2
      2  Orange     3
      3  Orange     4
      4     Red     3
      5     Red     4
      6     Red     5
      

      【讨论】:

        猜你喜欢
        • 2012-05-20
        • 1970-01-01
        • 2020-07-29
        • 2018-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-28
        • 1970-01-01
        相关资源
        最近更新 更多