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

如何移除Pandas DataFrame列名中开头的s或n字符

Pandas 修改列名:移除首字符为s/n的前缀

问题背景

现有Pandas DataFrame,列名如下:

Index(['ID_Produit', 'cTypeFinancialItem', 'cClasseFinancialItem',
       'sTypeFinancialObject', 'checkbox', 'sNom', 'sURL', 'sNomManager',
       'sNomTypeFinancialObject', 'sGroupeCat_Specific_Dynamic',
       'sGroupeCat_rng1', 'sCodeISIN', 'nVL', 'sCurrency', 'nStarRating',
       'nScore', 'nRetYTD', 'nRet1a', 'nRet3a', 'nRet5a', 'nRet1c', 'nRet3c',
       'nRet1j', 'nRet1m', 'nRet3m', 'nRet6m', 'nRet5c', 'nRet8c', 'nVolat1a',
       'nVolat3a', 'nVolat5a', 'nSharpe1a', 'nSharpe3a', 'nSharpe5a',
       'nPerteMax1a', 'nPerteMax3a', 'nPerteMax5a', 'nSortino1a', 'nSortino3a',
       'nSortino5a', 'nIr1A', 'nIr3A', 'nIr5A', 'nMinInvest', 'nFraisGestion',
       'nFraisEntree', 'nFraisSortie', 'dtRet', 'dtRetMonth', 'bFerme',
       'nIntensiteESG', 'nActifEur', 'nActifDiffEUR1m', 'nActifDiffEUR3m',
       'nActifDiffEUR6m', 'nActifDiffEUR1A', 'nActifCompartimentEUR',
       'nActifCompartimentDiffEUR1m', 'nActifCompartimentDiffEUR3m',
       'nActifCompartimentDiffEUR6m', 'nActifCompartimentDiffEUR1A',
       'nCollecteCompartiment1m', 'nCollecteCompartiment3m',
       'nCollecteCompartiment6m', 'nCollecteCompartimentYTD',
       'nCollecteCompartiment1A', 'nCollecteCompartiment3A', 'nCollecteRet1m',
       'nCollecteRet3m', 'nCollecteRet6m', 'nCollecteRetYTD', 'nCollecteRet1A',
       'nCollecteRet3A', 'nCollecteCompartimentRet1m',
       'nCollecteCompartimentRet3m', 'nCollecteCompartimentRet6m',
       'nCollecteCompartimentRetYTD', 'nCollecteCompartimentRet1A',
       'nCollecteCompartimentRet3A', 'isESG', 'sArticleSFDR', 'nIntensiteISR',
       'nESG_Environnement', 'nESG_Social', 'nESG_Gouvernance', 'nNbLabels',
       'sProspectusUrl', 'sUrlMainDocument', 'isMainDocumentAccessible'],
      dtype='object')

需求:将所有首字符为s或n的列名去掉首字符(如sNom改为Nom)。

原尝试代码(报错):

for col in df.columns:
    df[col] = df[col].apply(lambda x : x[1:] if x.startswith("s") or x.startswith('n') else x)

错误原因

原代码逻辑完全偏离目标:

  1. 操作对象错误:代码对列的数值执行字符串处理,但很多列是数值类型(如nVL、nStarRating),数值没有startswith方法,触发AttributeError。
  2. 目标错误:需求是修改列名,而非修改列内的值,应该操作df.columns而非列的内容。

正确解法

方法1:列表推导式(直观易懂)

直接遍历列名列表,修改后重新赋值给df.columns:

df.columns = [col[1:] if col.startswith(('s', 'n')) else col for col in df.columns]

方法2:正则替换(简洁高效)

利用Pandas的str.replace结合正则表达式,批量替换开头的s或n:

df.columns = df.columns.str.replace(r'^[sn]', '', regex=True)
  • 正则^[sn]:匹配以s或n开头的单个字符
  • 替换为空字符串,实现移除前缀的效果

方法3:自定义函数+map(灵活扩展)

如果需要更复杂的逻辑,可以定义函数后用map处理:

def clean_col_name(col):
    return col[1:] if col[0] in {'s', 'n'} else col

df.columns = df.columns.map(clean_col_name)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 10:43:11