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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 06:18:33