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

如何通过groupby添加列名并实现Pandas行式列表拆分?

解决方案

一、用groupby生成col_name列

先对val列执行explode拆分,再通过groupby('id')分组后,用cumcount()生成组内序号,最后拼接成指定格式的列名:

import pandas as pd

# 初始DataFrame
data = [[1, [10, 11]], [2, [15, 16]]] 
df = pd.DataFrame(data, columns = ['id', 'val'])

# 拆分val列
df_exploded = df.explode('val')
# 生成col_name列
df_exploded['col_name'] = df_exploded.groupby('id').cumcount().add(1).apply(lambda x: f'col_{x}')

执行后得到的结果:

id val col_name
0   1  10    col_1
0   1  11    col_2
1   2  15    col_1
1   2  16    col_2

二、直接生成目标宽表的方法

不需要先拆分再pivot,有三种更高效的方式:

方法1:利用列表直接构造DataFrame

将val列的列表直接转换成新的DataFrame,再与原id列合并:

df_wide = pd.DataFrame(df['val'].tolist(), columns=['col_1', 'col_2'])
df_wide['id'] = df['id']
df_wide = df_wide.set_index('id')

方法2:explode + pivot 链式操作

拆分后直接生成列名并完成重塑:

df_wide = (df.explode('val')
           .assign(col_name=lambda x: x.groupby('id').cumcount().add(1).apply(lambda y: f'col_{y}'))
           .pivot(index='id', columns='col_name', values='val')
           .reset_index())

方法3:str.get 提取列表元素

因所有列表长度一致,直接通过索引提取每个位置的元素:

df['col_1'] = df['val'].str[0]
df['col_2'] = df['val'].str[1]
df_wide = df.drop('val', axis=1).set_index('id')

三种方法最终都会得到目标宽表:

col_1  col_2
id              
1      10     11
2      15     16

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 13:53:13