将多级列添加到数据框

问题描述

一开始,我想向空数据框添加一个多级列。

df = pd.DataFrame({"nodes": list(range(1,5,2))})
df.set_index("nodes",inplace=True)

所以这是开始的数据框(仍然是空的):

>>> df
nodes
1
3

现在我想要第一个多级列。

我尝试了以下方法

new_df = pd.DataFrame.from_dict(dict(zip(df.index,[1,2])),orient="index",columns=["value"])

df = pd.concat([new_df],axis=1,keys=["test"])

现在数据框 df 看起来像这样:

>>> df
         test
        value
1           1
3           2

添加另一列,我做了类似的事情。

new_df2 = pd.DataFrame.from_dict(dict(zip(df.index,[3,4])),columns=[("test2","value2")])

df = pd.concat([df,new_df2],axis=1)
df.index.name = "nodes"

因此所需的数据框如下所示:

>>> df
          test       test2
nodes    value      value2
1            1           3
3            2           4

这种添加多级列的方式似乎有点奇怪。有没有更好的方法

解决方法

通过将您的 DataFrame 存储在 dict 中然后沿 axis=1 连接,在列上创建一个 MultIndex。 dict 的键成为 MultiIndex 列的级别(如果您使用元组,它将根据长度添加多个级别,标量键添加一个级别)并且 DataFrame 列保持原样。对行索引强制对齐。

import pandas as pd

d = {}
d[('foo','bar')] = pd.DataFrame({'val': [1,2,3]}).rename_axis(index='nodes')
d[('foo2','bar2')] = pd.DataFrame({'val2': [4,5,6]}).rename_axis(index='nodes')
d[('foo2','bar1')] = pd.DataFrame({'val2': [7,8,9]}).rename_axis(index='nodes')

pd.concat(d,axis=1)

      foo foo2     
      bar bar2 bar1
      val val2 val2
nodes              
0       1    4    7
1       2    5    8
2       3    6    9