如何移除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)
错误原因
原代码逻辑完全偏离目标:
- 操作对象错误:代码对列的数值执行字符串处理,但很多列是数值类型(如
nVL、nStarRating),数值没有startswith方法,触发AttributeError。 - 目标错误:需求是修改列名,而非修改列内的值,应该操作
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
相关产品推荐
相关产品推荐

