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

基于条件用列split结果填充Pandas的lag_id列问题求助

解决Lag_id列被清空的问题

嘿Lucas,我来帮你搞定这个问题!你之前的代码之所以会清空非Lag行的lag_id,是因为直接对整个Port列做字符串提取时,不包含“Lag”的行匹配不到内容,就会被替换成空值或NaN。咱们只需要给操作加上条件判断——仅处理包含“Lag”的行,其余行保留lag_id原有值即可,下面给你两种实用的解决方案:

方法一:用apply逐行判断(直观易懂)

这种方法适合需要更灵活逻辑的场景,逐行检查Port列内容,针对性处理:

import pandas as pd

# 假设你的数据存储在名为df的DataFrame中
df['lag_id'] = df.apply(
    lambda row: ''.join(filter(str.isdigit, str(row['Port']))) 
    if 'Lag' in str(row['Port']) 
    else row['lag_id'],
    axis=1
)

代码解释:

  • str(row['Port']):把Port列内容转成字符串,避免空值或非字符串类型报错
  • ''.join(filter(str.isdigit, ...)):提取Port字符串里的所有数字并拼接
  • 条件判断:仅当Port包含“Lag”时更新lag_id,否则保留原来的lag_id值

方法二:用str.extract + where(高效简洁)

如果你的数据量较大,这种矢量化操作会比apply更快:

# 提取Lag后面的数字,仅对包含Lag的行生效,其余行保留原值
df['lag_id'] = df['Port'].str.extract(r'Lag(\d+)', expand=False).where(
    df['Port'].str.contains('Lag', na=False), 
    df['lag_id']
)

代码解释:

  • str.extract(r'Lag(\d+)'):用正则匹配“Lag”后面的连续数字,提取出来
  • where(条件, 替代值):只有当Port包含“Lag”(na=False处理空值)时,才用提取的数字替换lag_id,否则保留原lag_id
  • 如果需要把提取的字符串转成数值类型,加上.astype(int)即可:
    df['lag_id'] = df['Port'].str.extract(r'Lag(\d+)', expand=False).astype(int).where(
        df['Port'].str.contains('Lag', na=False), 
        df['lag_id']
    )
    

内容的提问来源于stack exchange,提问作者Lucas Aimaretto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:48:12