来自 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的主要内容,如果未能解决你的问题,请参考以下文章