来自 Python 嵌套字典的 Pandas Dataframe

Posted

技术标签:

【中文标题】来自 Python 嵌套字典的 Pandas Dataframe【英文标题】:Pandas Dataframe from Python nested dictionary 【发布时间】: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 数组。 【参考方案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。查看修改后的答案。

以上是关于来自 Python 嵌套字典的 Pandas Dataframe的主要内容,如果未能解决你的问题,请参考以下文章

来自嵌套字典的 Pandas 数据框

用 Pandas 数据框中的行填充嵌套字典

来自嵌套字典的 Pandas 数据框在单列中

嵌套字典错误——Python Pandas

构建 MultiIndex pandas DataFrame 嵌套 Python 字典

Python Flatten 用 Pandas 将嵌套字典 JSON 相乘