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
Run Code Online (Sandbox Code Playgroud)
此功能非常有用,因为它允许同一数据帧的多个版本"水平"附加,第一级列名称(在我的示例中instance)区分实例.
想象一下,我已经拥有了这样的数据帧:
a b c
bar 0.102885 0.937838 0.907467
Run Code Online (Sandbox Code Playgroud)
有没有一种很好的方法可以为列名添加另一个级别,类似于行索引:
x['instance'] = 'first'
x.set_level('instance',append=True)
Run Code Online (Sandbox Code Playgroud)
小智 35
试试这个:
df=pd.DataFrame({'a':[1,2,3],'b':[4,5,6]})
columns=[('c','a'),('c','b')]
df.columns=pd.MultiIndex.from_tuples(columns)
Run Code Online (Sandbox Code Playgroud)
Ian*_*uza 13
无需创建元组列表
用: 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])
Run Code Online (Sandbox Code Playgroud)
结果数据帧:
new_label
a b c
0 0.25999 0.337535 0.333568
Run Code Online (Sandbox Code Playgroud)
您可以使用concat。给它提供一个数据帧字典,其中的键是要添加的新列级别。
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
Run Code Online (Sandbox Code Playgroud)
您可以使用相同的技术来创建多个级别。
In [49]: d['second_level'] = pd.DataFrame(columns=['idx', 'a', 'b', 'c'],
data=[[10, 0.29, 0.63, 0.99],
[20, 0.23, 0.26, 0.98]]).set_index('idx')
In [50]: pd.concat(d, axis=1)
Out[50]:
first_level second_level
a b c a b c
idx
10 0.89 0.98 0.31 0.29 0.63 0.99
20 0.34 0.78 0.34 0.23 0.26 0.98
Run Code Online (Sandbox Code Playgroud)
小智 7
其中许多解决方案似乎比实际需要的更复杂一些。
当速度不是绝对必要时,我更喜欢让事情看起来尽可能简单和直观。我认为这个解决方案可以实现这一点。早在 pandas 版本中进行了测试0.22.0。
只需创建一个 DataFrame(在第一步中忽略列),然后将列设置为等于您的 n 维列名称列表。
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
Run Code Online (Sandbox Code Playgroud)
小智 6
x = [('G1','a'),("G1",'b'),("G2",'a'),('G2','b')]
y = [('K1','l'),("K1",'m'),("K2",'l'),('K2','m'),("K3",'l'),('K3','m')]
row_list = pd.MultiIndex.from_tuples(x)
col_list = pd.MultiIndex.from_tuples(y)
A = pd.DataFrame(np.random.randint(2,5,(4,6)), row_list,col_list)
A
Run Code Online (Sandbox Code Playgroud)
这是创建多级列和行的最简单方法。
| 归档时间: |
|
| 查看次数: |
31243 次 |
| 最近记录: |