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

Pandas实现月份缩写转两位数字 连字符替换逗号处理方法

问题说明

现有如下DataFrame列数据:

col 
  0  NaN
  1  Jan,Apr,Jul,Oct
  2  Jan,Jun,Jul
  3  Apr,May,Oct,Nov
  4  NaN
 ...

需要完成的数据转换规则:

  • 列内的英文月份缩写转成两位整数月份值,补前导零,例如Jan对应01、Apr对应04
  • 原分隔月份的逗号替换为连字符-
  • 空值NaN保留不做处理
    期望最终输出效果:
col 
  0  NaN
  1  01-04-07-10
  2  01-06-07
  3  04-05-10-11
  4  NaN
 ...
实现方法

首先定义月份缩写和两位数字的映射字典,再对非空值做拆分、映射、拼接即可,空值直接跳过保留。

写法1:简单易读(适合绝大多数场景)

代码逻辑直观,常规数据量下足够用:

import pandas as pd
import numpy as np

# 测试数据构造
df = pd.DataFrame({
    'col': [np.nan, 'Jan,Apr,Jul,Oct', 'Jan,Jun,Jul', 'Apr,May,Oct,Nov', np.nan]
})

# 月份映射表
month_map = {
    'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04',
    'May': '05', 'Jun': '06', 'Jul': '07', 'Aug': '08',
    'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12'
}

# 转换逻辑
df['col'] = df['col'].apply(
    lambda val: '-'.join([month_map[month] for month in val.split(',')]) if pd.notna(val) else val
)

运行后打印df即可得到和预期完全一致的结果。

写法2:高性能向量化实现(适合百万级以上大数据量)

避免逐行apply的性能开销,用pandas内置向量化字符串操作提速:

# 拆分后映射再聚合
split_series = df['col'].str.split(',', expand=True).stack()
converted_series = split_series.map(month_map).unstack().agg('-'.join, axis=1)
# 回填空值
df['col'] = converted_series.where(df['col'].notna(), np.nan)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:39:17