Python按条件拆分DataFrame列并生成新列:Class1列处理需求
解决思路与代码实现
步骤1:解析Class1列结构
通过正则表达式提取拆分出数字标识和对应内容,兼容两种格式:
- 带
Lx_y_前缀的条目(如L1_2_Shipper Full Pallet):提取数字x、y,以及前缀后的描述内容 - 无前缀的条目(如
Intermittent_Bowling Conversion):直接提取完整描述内容
步骤2:构造新列标识
对带前缀的条目,用提取出的数字组合成列名(如L1_1、L1_2);无前缀的统一归到Other列。
步骤3:转换为宽表格式
通过透视操作将行数据转成列数据,得到目标结构。
完整代码示例
import pandas as pd # 模拟原始DataFrame df = pd.DataFrame({ 'Class1': [ 'Intermittent_Bowling Conversion', 'L1_2_Shipper Full Pallet', 'L1_1_BOGO' ] }) # 1. 提取数字标识和内容 df[['num1', 'num2', 'content']] = df['Class1'].str.extract(r'(?:L(\d+)_(\d+)_)?(.*)') # 2. 生成列名 df['col_name'] = df.apply( lambda row: f'L{row["num1"]}_{row["num2"]}' if pd.notna(row['num1']) else 'Other', axis=1 ) # 3. 透视转换为宽表 result = df.pivot(index=df.index, columns='col_name', values='content').fillna('') # 合并回原数据(可选,按需保留原Class1列) final_df = pd.concat([df['Class1'], result], axis=1) print(final_df)
正则表达式说明
(?:L(\d+)_(\d+)_)?(.*):
(?:...):非捕获组,用于匹配前缀但不单独提取整个前缀(\d+):捕获组,提取下划线间的数字?:表示前缀部分可选,兼容无前缀的条目(.*):捕获剩余所有内容作为描述文本
常见报错排查
如果之前用str.split报错,大概率是正则未兼容无前缀的情况,或拆分逻辑未考虑分组:
- 避免直接用
str.split(r'L(\d+)_(\d+)_'),无前缀的行无法匹配会返回NaN - 必须用
str.extract并添加可选匹配(?)覆盖所有情况
内容的提问来源于stack exchange,提问作者Sahil Jain
相关产品推荐
相关产品推荐

