将 dict 转换为具有更高级别的数据帧

Posted

技术标签:

【中文标题】将 dict 转换为具有更高级别的数据帧【英文标题】:convert a dict to a dataframe with one more level 【发布时间】:2019-01-11 21:24:49 【问题描述】:

我有一个字典,它的两个元素是两个具有相同索引和列名的数据框。就像下面的代码:

my_dict = 
my_dict['df1'] = pd.DataFrame(np.arange(6).reshape(3,2),index = ['r1','r2','r3'],columns=['c1', 'c2'])
my_dict['df2'] = pd.DataFrame((np.arange(6)+10).reshape(3,2),index = ['r1','r2','r3'],columns=['c1', 'c2'])

my_dict['df1'] 
Out[1]: 
    c1  c2
r1   0   1
r2   2   3
r3   4   5

my_dict['df2']
Out[2]: 
    c1  c2
r1  10  11
r2  12  13
r3  14  15

如何将 dict 转换为一个数据帧。索引将保持与原始索引相同,但我为以下列增加了一层:

    df1     df2
    c1  c2  c1  c2
r1   0   1  10  11
r2   2   3  12  13
r3   4   5  14  15

【问题讨论】:

你试过这个答案了吗:***.com/questions/18262962/… Concatenate Pandas columns under new multi-index level的可能重复 如上链接建议,你可以试试pd.concat(my_dict.values(), axis=1, keys=my_dict.keys()) 谢谢! @student 太好了。一个小问题,链接提到“应该避免以这种方式使用 d.values 和 d.keys,因为不能保证订单会得到维护”。你知道如何维护订单吗? 我在讨论后添加了答案,您可以检查它是否有效。 【参考方案1】:

你试过了吗:

df1=my_dict['df1']
df2=my_dict['df2']
df1.columns = [['df1']*df1.shape[1],df1.columns]
df2.columns = [['df2']*df2.shape[1],df2.columns]
df1.join(df2)

【讨论】:

谢谢。有用。但我认为学生的回答更适合我的情况,因为我必须在同一周内组合数百个数据框。 是的,学生打败了我!【参考方案2】:

您可能需要类似于other answer 的东西。正如其他答案中的讨论指出的那样,仅使用pd.concat(my_dict.values(), axis=1, keys=my_dict.keys()) 并不能保证.values().keys() 的顺序相同。

因此,k, values = zip(*my_dict.items()) 可用于保留订单并将它们与pd.concat 一起使用:

k, values = zip(*my_dict.items())
new_df = pd.concat(values, keys = k, axis=1)

【讨论】:

以上是关于将 dict 转换为具有更高级别的数据帧的主要内容,如果未能解决你的问题,请参考以下文章

如何在 mailchimp 中使用更高级别的 pygments 语法

如何将多个 Stream 合并为更高级别的 Stream?

区块链技术为保险行业带来更高级别的数据保护

将 dict 构造函数转换为 Pandas MultiIndex 数据帧

使用 pymongo 从多个更高级别的数组对象聚合嵌套数组对象

将 Formik 值提升到更高级别的状态