python - Unstack MultiIndex 数据帧
问题描述
我正在用这个多索引数据框编写一个测试用例,但我无法取消堆叠。下面的函数会产生我从 excel 文件中读取的布局,就像这个示例一样:示例文件
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:没有足够的值来解包(预期 2,得到 0)
有任何想法吗?同样的 unstack 调用也适用于示例 Excel 文件。
非常感谢!
解决方案
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
推荐阅读
- c# - EF 映射问题
- android - Android Linkify.addLinks() 适用于一个 textview 而不是另一个
- swift - ForEach 在符合 Identifiable 协议后无法在 SwiftUI 中工作
- javascript - 在 Javascript 中捕获用户输入不起作用
- python - How to stop printing a space in python2 print with a comma
- php - 如何同时加载两个视图 CodeIgniter($data 和 compact)
- javascript - 如何使用 antd-mask-input 库获取 antd 表单字段的原始值?
- sql - 如何除以与 ColumnB 中的另一个值相关的 columnA 中的值
- pyspark - 使用 pySpark 将值打印为德国千位分隔符和十进制值
- reactjs - 更新标记而不重新加载整个地图