You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas中不透视数据表,按组生成嵌套数值列表?

不透视DataFrame生成指定嵌套列表的方法

问题背景

先通过以下代码生成目标DataFrame:

import numpy as np
import pandas as pd

data = np.random.uniform(0, 1, (4, 5))
df = pd.DataFrame(data, columns = [2010,2011,2012,2013,2014])
df = df.stack().reset_index().drop(['level_0'], axis =1)

生成的DataFrame结构如下:

level_1         0
0      2010  0.490534
1      2011  0.292247
2      2012  0.809696
3      2013  0.198586
4      2014  0.642714
5      2010  0.854330
6      2011  0.637989
7      2012  0.229752
8      2013  0.017705
9      2014  0.632559
10     2010  0.596599
11     2011  0.919915
12     2012  0.622230
13     2013  0.991401
14     2014  0.983660
15     2010  0.351667
16     2011  0.439194
17     2012  0.532181
18     2013  0.205366
19     2014  0.226996

需求是生成**[[各年份的第一个值], [各年份的第二个值], [各年份的第三个值],...]**格式的嵌套列表,且无需先对DataFrame做透视操作。已知通过透视表可以实现,但希望找到更直接的方案。

解决方案

方法1:按行索引分组提取

利用行索引整除5生成分组标识,再按年份排序后分组取值:

# 每5行划分为一组,生成分组标识
groups = df.index // 5
# 按分组和年份排序,提取每组的数值并转为嵌套列表
result = df.sort_values(['level_1']).groupby(groups)[0].apply(list).tolist()

方法2:直接重塑数组形状(最简单)

如果数据保持原始顺序(每组内年份连续且顺序一致),可以直接提取数值列转为numpy数组,再调整形状后转列表:

# 提取数值列转为数组,重塑为(4,5)的二维结构,再转嵌套列表
result = df[0].values.reshape(4, 5).tolist()

注:此方法依赖数据的原始排列顺序,从示例数据来看完全符合要求。

方法3:用分组序号标识原始行

如果数据顺序不确定,可先给每个年份的行生成组内序号,再按序号分组提取:

# 给每个年份的行生成组内序号(0-4)
df['group_id'] = df.groupby('level_1').cumcount()
# 按序号分组,提取数值并转为嵌套列表
result = df.sort_values('level_1').groupby('group_id')[0].apply(list).tolist()

内容的提问来源于stack exchange,提问作者ruthpozuelo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 12:05:08