【发布时间】:2023-03-23 07:35:02
【问题描述】:
主要目标是从现有的df 中设置多索引行。
假设我们有如下多级列
level1
level2
sub_name A B C
ONE TT 11 12 13
TWO TT 21 22 23
THREE TT 31 32 33
然后,预期的输出 (1)
level1
level2
A B C
TT ONE 11 12 13
TWO 21 22 23
THREE 31 32 33
我觉得这可以通过group 或直接使用set_index 来实现,如下所示
df = df.groupby((slice ( None ), slice ( None ),'sub_name'),as_index = False)
或
df=df.set_index([(slice ( None ), slice ( None ),'sub_name')])
但是,这不起作用。
使得第一种方法返回错误
TypeError: unhashable type: 'slice'
第二种方法
TypeError:参数“keys”可能是列键,一维 数组,或仅包含有效列键和一维的列表 数组.. 接收到
类型的列
我想知道实现预期目标的正确方法是什么。
重现上述错误的完整代码
import pandas as pd
df = pd.DataFrame ( {'A': [11, 21, 31],
'B': [12, 22, 32],
'C': [13, 23, 33]},
index=['ONE', 'TWO', 'THREE'] )
df.columns = pd.MultiIndex.from_product ( [['level1'], ['level2'], df.columns] )
df2 = pd.DataFrame ( ['TT'] * len ( df ), index=df.index,
columns=pd.MultiIndex.from_product ( [df.columns.levels [0],
df.columns.levels [1],
['sub_name']] ) )
# Im just curios whether there is simpler way of creating constant column like this
df = pd.concat ( [df2,df ], axis=1 )
# df = df.groupby((slice ( None ), slice ( None ),'sub_name'),as_index = False)
# df=df.set_index([(slice ( None ), slice ( None ),'sub_name')])
在contributor 的支持下。
额外的问题是是否可以在TT 之上添加另一个级别而无需创建常量列(即df2)
level1
level2
A B C
main_level TT ONE 11 12 13
TWO 21 22 23
THREE 31 32 33
【问题讨论】: