Python 在多索引数据帧中,groupby后面的.columns.levels[1]给出了整个数据帧的列

Python 在多索引数据帧中,groupby后面的.columns.levels[1]给出了整个数据帧的列,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,假设我有三个数据帧,在多索引的帮助下水平连接: df1 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)), columns=list('ABCDE')) df2 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)),columns=list('AGHIJ')) df3 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)),colum

假设我有三个数据帧,在多索引的帮助下水平连接:

df1 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)), columns=list('ABCDE'))
df2 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)),columns=list('AGHIJ'))
df3 = pd.DataFrame(data=np.random.randint(0, 100, (4, 5)),columns=list('ALMNP'))
dfs = []
dfs.append(df1)
dfs.append(df2)
dfs.append(df3)
result = pd.concat(dfs, axis=1, keys=range(len(dfs)))
如果我按第一个索引分组,我应该得到我的第一个数据帧,如果我查看它的列列表,它应该是ABCD,但事实并非如此

print(result.groupby(axis=1, level=0).get_group(0).columns.levels[1])

提供df1、df2和df3的所有列

我将使用
获取级别值
,因为
级别
保留原始数据帧列的所有类别

result.groupby(axis=1, level=0).get_group(0).columns.get_level_values(1)
Out[1296]: Index(['A', 'B', 'C', 'D', 'E'], dtype='object')

这是
未使用级别的问题。当您有多索引时,级别仍然存在,只是未使用,因此您可以在需要时删除它们:

result.groupby(axis=1, level=0).get_group(0).columns.remove_unused_levels().levels[1]
#Index(['A', 'B', 'C', 'D', 'E'], dtype='object')

要查看所有内容是否仍然存在,请查看列。第一个级别仍有13个值,但此组仅引用前5个值

print(result.groupby(axis=1, level=0).get_group(0).columns)
#MultiIndex(levels=[[0, 1, 2], ['A', 'B', 'C', 'D', 'E', 'G', 'H', 'I', 'J', 'L', 'M', 'N', 'P']],
#           codes=[[0, 0, 0, 0, 0], [0, 1, 2, 3, 4]])