python - 取消堆叠多索引数据帧

标签 python pandas multi-index

我正在使用这个多索引数据框编写一个测试用例,但我无法取消堆栈。以下函数准确生成我从 Excel 文件中读取的布局,就像此示例一样: Sample file

def mocked_df():
    people = ['USER 1', 'USER 2', 'USER 3',
              'USER 4', 'USER 5', 'USER 6']
    flag_and_states = [['A', 'B'], ['AL', 'AR', 'CA', 'CO']]

    # Building multi-index frame
    index = pd.MultiIndex.from_product([people])
    columns = pd.MultiIndex.from_product(flag_and_states, names=['Flag', 'Name'])
    data = [[1, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0],
            [0, 0, 1, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 1, 0],
            [0, 0, 0, 1, 0, 0, 0, 0]]

    # Return data frame with multi-index
    return pd.DataFrame(
        columns=columns,
        index=index,
        data=data
    )

在此之后,我尝试拆开数据框:

df = mocked_df()
df = df.unstack().reset_index()

但我有以下错误:

ValueError: not enough values to unpack (expected 2, got 0)

有什么想法吗?当在示例 Excel 文件上使用时,相同的 unstack 调用也可以工作。

非常感谢!

最佳答案

这是索引中的一级 MultiIndex 问题,因此 unstack 失败并出现非常奇怪的错误。

print (df.index.nlevels)
1
#correct 2 level MultiIndex in columns
print (df.columns.nlevels)
2

print (df.index)
MultiIndex([('USER 1',),
            ('USER 2',),
            ('USER 3',),
            ('USER 4',),
            ('USER 5',),
            ('USER 6',)],
           )

#correct 2 level MultiIndex in columns
print (df.columns)
MultiIndex([('A', 'AL'),
            ('A', 'AR'),
            ('A', 'CA'),
            ('A', 'CO'),
            ('B', 'AL'),
            ('B', 'AR'),
            ('B', 'CA'),
            ('B', 'CO')],
           names=['Flag', 'Name'])

解决方案是仅通过列表index = people创建索引,因为索引中没有MultiIndex:

def mocked_df():
    people = ['USER 1', 'USER 2', 'USER 3',
              'USER 4', 'USER 5', 'USER 6']
    flag_and_states = [['A', 'B'], ['AL', 'AR', 'CA', 'CO']]

    # Building multi-index frame
    index = people
    columns = pd.MultiIndex.from_product(flag_and_states, names=['Flag', 'Name'])
    data = [[1, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0],
            [0, 0, 0, 0, 0, 1, 0, 0],
            [0, 0, 1, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 1, 0],
            [0, 0, 0, 1, 0, 0, 0, 0]]

    # Return data frame with multi-index
    return pd.DataFrame(
        columns=columns,
        index=index,
        data=data
    )

然后unstack工作正常:

df = mocked_df()
df = df.unstack().reset_index()
print (df.head(10))
  Flag Name level_2  0
0    A   AL  USER 1  1
1    A   AL  USER 2  0
2    A   AL  USER 3  0
3    A   AL  USER 4  0
4    A   AL  USER 5  0
5    A   AL  USER 6  0
6    A   AR  USER 1  0
7    A   AR  USER 2  0
8    A   AR  USER 3  0
9    A   AR  USER 4  0

关于python - 取消堆叠多索引数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57429837/

相关文章:

c++ - 如何在不删除元素并将其重新插入到 boost::multi_index_container 的情况下移动元素?

python - pandas多索引直接排序

python - 在同一行中打印奇数索引

python - 高效合并大量pyspark DataFrame

python - 枚举 Django 数据库缓存中的键

python - 操作系统错误 : exception: access violation reading with Cyphon basic example

python - 以 n 行作为输入并在列中的总和等于 n 时返回列名称的函数

python - 根据上次某些条件成立的时间,将一列中的数据与另一行对齐

python - 使用线性插值填充时间戳 NaT

python - 按 multiIndex 之一的最高分位数过滤数据帧行