gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 00:39:58 25 4
gpt4 key购买 nike

我正在使用这个多索引数据框编写一个测试用例,但我无法取消堆栈。以下函数准确生成我从 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com