python - 生成不同长度的MultiIndex DataFrame
问题描述
我需要从给定的数据初始化一个 multiIndex DataFrame。
id = ['a','b','c']
;
days = [2,5,4]
,这意味着,每个id都有其对应的天数,即'a'有第1,2天;'b' 有第 1,..,5 天;'c' 有第 1 天,...第 4 天。换句话说,每个 id 的日子都不同。
并且每天有 4 个时段,prd = [0,1,2,3]
. 我期望的是,在每一天和每一时期,每个 id 都有一个 DataFrame 的 MultiIndex。
MultiIndex([('a',1,0),
('a',1,1),
('a',1,2),
('a',1,3),
('a',2,0),
('a',2,1),
('a',2,2),
('a',2,3),
('b',1,0),
('b',1,1),
('b',1,2),
...
('b',5,1),
('b',5,2),
('b',5,3),
('c',1,0),
('c',1,1),
('c',1,2),
...
('c',4,1),
('c',4,2),
('c',4,3),
],
names=['id','day','prd']
)
我尝试在python中处理:因为不同id的天数不同,所以我通过循环和列表推导生成了两个完整的id和天数列表,然后将zip
它们组合在一起以获得元组对。然后我使用itertools.product()
与句号结合。但我得到的是
[(('a',1),0),
(('a',1),1),
(('a',1),2),....]
如果我使用pd.MultiIndex.from_product()
,我会得到类似的结果,前两个索引在一个组中,第三个索引是分开的。
既然product
这两种方式都无济于事,旧的时尚是也延伸prd
到长而完整的列表以匹配其他两个家伙,并立即将它们拉上拉链。
我真的很想知道是否有更好的方法从一开始就生成索引,比这么长的循环、列表理解、zip 和产品组合在一起更好。除了原生 python 数据结构之外,Pandas 中是否有任何东西可以处理这种情况?
非常感谢!
解决方案
使用列表推导式创建组合zip
:
id = ['a','b','c']
prd = [0,1,2,3]
days = [2,5,4]
result = [(idx, i, p) for d, idx in zip(days, id) for i in range(1, d+1) for p in prd]
print (pd.MultiIndex.from_tuples(result))
MultiIndex([('a', 1, 0),
('a', 1, 1),
('a', 1, 2),
('a', 1, 3),
('a', 2, 0),
('a', 2, 1),
('a', 2, 2),
('a', 2, 3),
('b', 1, 0),
('b', 1, 1),
('b', 1, 2),
('b', 1, 3),
('b', 2, 0),
('b', 2, 1),
('b', 2, 2),
('b', 2, 3),
('b', 3, 0),
('b', 3, 1),
('b', 3, 2),
('b', 3, 3),
('b', 4, 0),
('b', 4, 1),
('b', 4, 2),
('b', 4, 3),
('b', 5, 0),
('b', 5, 1),
('b', 5, 2),
('b', 5, 3),
('c', 1, 0),
('c', 1, 1),
('c', 1, 2),
('c', 1, 3),
('c', 2, 0),
('c', 2, 1),
('c', 2, 2),
('c', 2, 3),
('c', 3, 0),
('c', 3, 1),
('c', 3, 2),
('c', 3, 3),
('c', 4, 0),
('c', 4, 1),
('c', 4, 2),
('c', 4, 3)],
)
推荐阅读
- python - 该函数要么返回 None 要么在没有返回语句的情况下结束,使用 docker 将 python 与 mysql 连接起来
- android - 我在运行时在 junit 测试和 Android (ART) 上的相同输入得到了不同的结果
- node.js - reactjs项目报错如何解决
- jupyter-notebook - 运行所有单元 jupyter notebook 失败:一个接一个手动 - 是,运行 al- 否
- android - 如何使用 Coil 将图像文件加载到 Jetpack Compose Image
- android - SoundPool 仅在第一次被调用时播放声音
- python-3.x - 有符号浮点数转十六进制数
- sql - 在 PostgresSQL 中为在 SQL Server 中工作的查询创建视图(两个 DATETIME 列/TIMECODE 之间的 COUNT
- reactjs - 我如何使用 reactspring 更改和动画 div 背景图像
- asp.net - foreach 中的调用服务会减慢 Asp.Net Core 3 的速度吗?