如何在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
相关产品推荐
相关产品推荐

