问题描述
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