【问题标题】:Pandas Dataframe from Python nested dictionary来自 Python 嵌套字典的 Pandas Dataframe
【发布时间】:2019-11-16 23:59:43
【问题描述】:

我正在尝试从 python 嵌套字典创建一个 Pandas 数据框,如下所示:

dictionary = {'user1' : {'a': np.array([1,2,3,4]),
                         'b': np.array([6,7,8,9])},

              'user2' : {'a': np.array([2,3,4,5]),
                         'b': np.array([7,8,9,1])}}

我希望数据框看起来像这样:

      a_w a_x a_y a_z b_w b_x b_y b_z
user1  1   2   3   4   6   7   8   9
user2  2   3   4   5   7   8   9   1

编辑:(其中 w,x,y,z 是指示数组中的值代表什么的标记)

我尝试修改这些问题中的解决方案: Nested dictionary to multiindex dataframe where dictionary keys are column labels

Construct pandas DataFrame from items in nested dictionary

但无法获得正确的形式。

任何帮助都会很棒,谢谢。

【问题讨论】:

  • 不知道为什么你想要有重复标题的数据框...
  • 查看更新的回复。
  • 使用 numpy 数组有什么特别的原因吗?是否允许使用普通列表来回答您的问题?
  • @amanb 是的,数据是大型 3d numpy 数组。

标签: python pandas dictionary nested


【解决方案1】:

您可以用字典理解来完成整个事情,并使用enumerate 跟踪每个元素的索引,给您一些排序的外观。

d = {
  k: {f'{ik}_{idx}': el for ik, iv in v.items() for idx, el in enumerate(iv)}
  for k, v in dictionary.items()
}

pd.DataFrame.from_dict(d, orient='index')

       a_0  a_1  a_2  a_3  b_0  b_1  b_2  b_3
user1    1    2    3    4    6    7    8    9
user2    2    3    4    5    7    8    9    1

【讨论】:

    【解决方案2】:

    重复的列名很少是一个好主意..但是你去吧,

    更新 2

    result = pd.concat({key:pd.DataFrame(val,index=['w','x','y','z']) for key,val in dictionary.items()})
               .unstack(-1)
    

    你知道吗,我会将多索引留在列中,而不是使用 _ 连接。以这种方式保留它通常更灵活。

    更新 1

    result = (pd.concat({key:pd.DataFrame(val) for key,val in dictionary.items()})
                .unstack(-1).droplevel(1,axis=1)
    

    原创

    result = (pd.concat({key:pd.DataFrame(val) for key,val in dictionary.items()})
                .unstack(-1).T
                .reset_index(level=1,drop=True).T)
    
    result
            a   a   a   a   b   b   b   b
    user1   1   2   3   4   6   7   8   9
    user2   2   3   4   5   7   8   9   1
    
    

    【讨论】:

    • 不错!顺便提一句。您可以避免转置操作(这可能很昂贵并且会破坏您的列类型)。您可以使用result.columns.droplevel(1) 而不是reset_index 来做到这一点。
    • 非常感谢您的回答。确实,您对列名是正确的。我打错了,列名应由 4 个字母之一索引:a_w、a_x、a_y、a_z、b_w、b_x、b_y、b_z。我已经更新了这个问题。你的答案很容易修改吗?再次感谢。
    • @jottbe 哈哈正确!我完全忘记了!实际上,从 24 开始,您可以在数据框和控制轴上应用 droplevel。查看修改后的答案。
    猜你喜欢
    • 2019-07-26
    • 2022-01-01
    • 2022-01-02
    • 1970-01-01
    • 2020-02-18
    • 2019-12-01
    • 2018-07-13
    • 1970-01-01
    • 2020-03-04
    相关资源
    最近更新 更多