首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解栈MultiIndex数据帧

解栈MultiIndex数据帧
EN

Stack Overflow用户
提问于 2019-08-09 12:12:47
回答 2查看 407关注 0票数 1

我正在用这个多索引数据框架编写一个测试用例,但是我无法打开堆栈。以下函数准确地生成了我从excel文件中读取的布局,如下所示:样本文件

代码语言:javascript
复制
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
    )

在此之后,我试图打开数据框架:

代码语言:javascript
复制
df = mocked_df()
df = df.unstack().reset_index()

但我有以下错误:

ValueError:没有足够的值来解压(预期的2,got 0)

有什么想法吗?在示例Excel文件上使用时,同样的堆栈调用也能工作。

非常感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-09 12:17:43

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

代码语言:javascript
复制
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

代码语言:javascript
复制
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正确地工作:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2019-08-09 12:17:06

您没有提供所需的输出,如果您尝试:

代码语言:javascript
复制
df = df.stack().reset_index()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57429837

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档