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

