基于条件用列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
相关产品推荐
相关产品推荐

