如何将含逗号分隔值的分组Pandas DataFrame拆分为多行?
解决Pandas DataFrame多列同步拆分并生成单行对应单个exam的方案
我明白你遇到的麻烦了——单独用split加explode拆分时,很容易因为没同步处理所有关联列,导致col1、col2和exams的对应关系乱掉。咱们可以通过先把所有需要拆分的列转成列表,再一次性拆分多列的方式解决这个问题,具体操作如下:
步骤1:构造示例数据
先还原你给出的示例DataFrame:
import pandas as pd data = { 'col1': ['0,0,0', '0,1,0,20', '0,0,0,30'], 'col2': ['0,0,0', '0,0,2,20', '0,0,20,20'], 'name': ['A1', 'A2', 'A3'], 'exams': ['exm1,exm2,exm3', 'exm1,exm2,exm4,exm5', 'exm1,exm2,exm3,exm5'] } df = pd.DataFrame(data)
步骤2:同步拆分多列(推荐方案,Pandas 1.3.0+支持)
从Pandas 1.3.0版本开始,explode方法支持同时传入多个列名,这样就能保证拆分后col1、col2和exams的对应关系完全匹配:
# 将col1、col2、exams按逗号拆分为列表 df[['col1', 'col2', 'exams']] = df[['col1', 'col2', 'exams']].apply(lambda x: x.str.split(',')) # 一次性拆分这三列,同时重置索引 result_df = df.explode(['col1', 'col2', 'exams'], ignore_index=True) # 可选:将col1和col2转换为整数类型(根据你的需求选择) result_df[['col1', 'col2']] = result_df[['col1', 'col2']].astype(int)
执行后得到的结果就是你想要的每行对应单个exam的形式:
col1 col2 name exams 0 0 0 A1 exm1 1 0 0 A1 exm2 2 0 0 A1 exm3 3 0 0 A2 exm1 4 1 0 A2 exm2 5 0 2 A2 exm4 6 20 20 A2 exm5 7 0 0 A3 exm1 8 0 0 A3 exm2 9 0 20 A3 exm3 10 30 20 A3 exm5
兼容低版本Pandas的方案(适用于1.3.0以下版本)
如果你的Pandas版本较低,不支持多列explode,可以通过zip将每行的三个列表打包,再拆分的方式实现:
# 先将col1、col2、exams拆分为列表 df[['col1', 'col2', 'exams']] = df[['col1', 'col2', 'exams']].apply(lambda x: x.str.split(',')) # 将每行的三个列表打包成元组列表 df['combined'] = df.apply(lambda row: list(zip(row['col1'], row['col2'], row['exams'])), axis=1) # 拆分combined列 result_df = df.explode('combined', ignore_index=True) # 将元组拆分回单独的列 result_df[['col1', 'col2', 'exams']] = pd.DataFrame(result_df['combined'].tolist(), index=result_df.index) # 清理临时列 result_df.drop('combined', axis=1, inplace=True) # 可选转换数据类型 result_df[['col1', 'col2']] = result_df[['col1', 'col2']].astype(int)
注意事项
- 确保每行的col1、col2、exams拆分后的元素数量完全一致,否则会出现匹配错误。如果存在数量不一致的行,需要先对数据进行清洗(比如补全缺失值或过滤异常行)。
内容的提问来源于stack exchange,提问作者Hemantchandru naik
相关产品推荐
相关产品推荐

