【问题标题】:In a multi-indexed dataframe .columns.levels[1] after groupby gives the columns of the whole dataframe在 groupby 之后的多索引数据帧 .columns.levels[1] 给出整个数据帧的列
【发布时间】:2019-05-03 14:43:36
【问题描述】:

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

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 的所有列

【问题讨论】:

    标签: python pandas dataframe merge


    【解决方案1】:

    这是unused levels 的问题。当您拥有 MultiIndex 时,级别仍然存在,只是未使用,因此您可以在需要时将其删除:

    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]])
    

    【讨论】:

      【解决方案2】:

      我将使用get_level_values,因为levels 保留所有类别的原始数据框列

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-28
        • 1970-01-01
        • 2021-11-29
        • 2019-08-12
        • 1970-01-01
        • 2022-12-17
        相关资源
        最近更新 更多