pandas
支持多级列名称:
>>> x = pd.DataFrame({'instance':['first','first','first'],'foo':['a','b','c'],'bar':rand(3)})
>>> x = x.set_index(['instance','foo']).transpose()
>>> x.columns
MultiIndex
[(u'first', u'a'), (u'first', u'b'), (u'first', u'c')]
>>> x
instance first
foo a b c
bar 0.102885 0.937838 0.907467
此功能非常有用,因为它允许同一数据帧的多个版本“水平”附加到第一级列名(在我的示例中为instance
)来区分实例。
想象一下,我已经有了这样的数据框:
a b c
bar 0.102885 0.937838 0.907467
是否有一种很好的方法可以为列名添加另一个级别,类似于行索引:
x['instance'] = 'first'
x.set_level('instance',append=True)
答案 0 :(得分:29)
试试这个:
df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
columns=[('c','a'),('c','b')]
df.columns=pd.MultiIndex.from_tuples(columns)
答案 1 :(得分:8)
无需创建元组列表
使用:pd.MultiIndex.from_product(iterables)
import pandas as pd
import numpy as np
df = pd.Series(np.random.rand(3), index=["a","b","c"]).to_frame().T
df.columns = pd.Multiindex.from_product([["new_label"], df.columns])
结果数据框:
new_label
a b c
0 0.25999 0.337535 0.333568
答案 2 :(得分:4)
您可以使用concat
。给它提供一个数据帧字典,其中的键是要添加的新列级别。
aux = plt.scatter(obj_dy[:], obj_dx[:], color='green')
for k in range(len(obj_index)):
aux1 = plt.annotate(str(obj_index[k]), xy = (obj_dy[k], obj_dx[k]))
plt.pause(0.1000)
aux.remove()
aux1.remove()
您可以使用相同的技术来创建多个关卡。
In [46]: d = {}
In [47]: d['first_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
data=[[10, 0.89, 0.98, 0.31],
[20, 0.34, 0.78, 0.34]]).set_index('idx')
In [48]: pd.concat(d, axis=1)
Out[48]:
first_level
a b c
idx
10 0.89 0.98 0.31
20 0.34 0.78 0.34
答案 3 :(得分:1)
许多这些解决方案似乎比它们需要的复杂一些。
当速度不是绝对必要时,我希望使事情看起来尽可能简单直观。我认为此解决方案可以达到目的。
早在0.22.0
的熊猫版本中进行了测试。
只需创建一个DataFrame(在第一步中忽略列),然后将列设置为等于列名的n-dim列表即可。
In [1]: import pandas as pd
In [2]: df = pd.DataFrame([[1, 1, 1, 1], [2, 2, 2, 2]])
In [3]: df
Out[3]:
0 1 2 3
0 1 1 1 1
1 2 2 2 2
In [4]: df.columns = [['a', 'c', 'e', 'g'], ['b', 'd', 'f', 'h']]
In [5]: df
Out[5]:
a c e g
b d f h
0 1 1 1 1
1 2 2 2 2
答案 4 :(得分:0)
这是一个可以帮助您创建元组的函数,该函数可以由pd.MultiIndex.from_tuples()使用,但更为通用。从@ user3377361得到了这个想法。
def create_tuple_for_for_columns(df_a, multi_level_col):
"""
Create a columns tuple that can be pandas MultiIndex to create multi level column
:param df_a: pandas dataframe containing the columns that must form the first level of the multi index
:param multi_level_col: name of second level column
:return: tuple containing (second_level_col, firs_level_cols)
"""
temp_columns = []
for item in df_a.columns:
temp_columns.append((multi_level_col, item))
return temp_columns
可以这样使用:
df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
columns=create_tuple_for_for_columns(df, 'c')
df.columns=pd.MultiIndex.from_tuples(columns)
答案 5 :(得分:0)