如何通过GroupBy与多聚合将指定Pandas DataFrame转为目标嵌套列表?
问题:将DataFrame转换为指定嵌套列表格式
现有通过pd.read_sql_query获取的DataFrame,结构及示例数据如下:
tabla nombre_razon periodos Bancos | ALIAGA ORTIZ LILIA ROXANA | [201801,201902] Bancos | CIELO PLAST EIRL | [201702] Bancos | COCHACHIN AGUIRRE ELIAS PABLO | [201801,201902,202001] Bancos | COPLASTICA SAC | [202203, 202102, 202110, 202105, 202206] Bancos | ECOPET PERU SAC | [201801,201902] Ventas | ALIAGA ORTIZ LILIA ROXANA | [202201, 202202, 202109, 202107] Ventas | GRUPO ELIAPAC SAC | [202207, 202209, 202205, 202203, 202109] Ventas | COPLASTICA SAC | [201801,201902] Ventas | ECOPET PERU SAC | [201801,201902] Ventas | KENTHIVAS SAC | [202208, 202201, 202112, 202202] Compras | ALIAGA ORTIZ LILIA ROXANA | [201801,201902] Compras | CIELO PLAST EIRL | [202204, 202201, 202202, 202209] Compras | COCHACHIN AGUIRRE ELIAS PABLO | [201801,201902] Compras | ECOPET PERU SAC | [202201, 202107, 202108, 202109] Compras | KENTHIVAS SAC | [201801,201902]
需要将其转换为如下嵌套列表格式:
[ ['Bancos','Ventas','Compras'], [ ['ALIAGA ORTIZ LILIA ROXANA','CIELO PLAST EIRL','COCHACHIN AGUIRRE ELIAS PABLO','COPLASTICA SAC','ECOPET PERU SAC'], ['ALIAGA ORTIZ LILIA ROXANA','GRUPO ELIAPAC SAC','COPLASTICA SAC','ECOPET PERU SAC','KENTHIVAS SAC'], ['ALIAGA ORTIZ LILIA ROXANA','CIELO PLAST EIRL','COCHACHIN AGUIRRE ELIAS PABLO','ECOPET PERU SAC','KENTHIVAS SAC'] ], [ [['201801','201902'],['201702'],['201801','201902','202001'],['202203','202102','202110','202105', '202206'],['201801','201902']], [['202201','202202','202109','202107'],['202207','202209','202205','202203','202109'],['201801','201902'],['201801','201902'],['202208','202201','202112','202202']], [['201801','201902'],['202204','202201', '202202','202209'],['201801','201902'],['202201','202107','202108','202109'],['201801','201902']] ] ]
用户尝试过以下两种方法但未成功:
方法一:
dataFrame.groupby(['tabla', 'nombre_razon','periodos'])
方法二:
comboGeneral2['periodo_tributario']=comboGeneral2['periodo_tributario'].apply(str) comboGeneral1=comboGeneral3.groupby('tabla')['nombre_razon','periodo_tributario'].agg(lambda x: list(x)).reset_index()
解决方案
可以通过分组后分别提取三个层级的数据,再组合成目标嵌套结构,具体代码如下:
import pandas as pd # 假设你的DataFrame名为df # 按tabla分组,保留原数据中的顺序 grouped = df.groupby('tabla', sort=False) # 提取第一层:所有tabla名称 level1 = list(grouped.groups.keys()) # 提取第二层:每个tabla对应的nombre_razon列表 level2 = [group['nombre_razon'].tolist() for _, group in grouped] # 提取第三层:每个tabla对应的periodos嵌套列表 level3 = [group['periodos'].tolist() for _, group in grouped] # 组合成目标格式的嵌套列表 result = [level1, level2, level3] print(result)
代码说明:
- 分组控制顺序:使用
sort=False保证分组后的tabla顺序和原DataFrame中出现的顺序一致,避免结果顺序混乱。 - 层级数据提取:
level1直接获取分组后的所有tabla名称;level2遍历每个分组,将分组内的nombre_razon列转为列表;level3遍历每个分组,将分组内的periodos列转为列表(原periodos已是列表类型,tolist会保留其嵌套结构)。
- 组合结果:将三个层级的数据放入一个大列表,即可得到目标格式的嵌套列表。
内容的提问来源于stack exchange,提问作者Raknaros
相关产品推荐
相关产品推荐

