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
相关产品推荐
相关产品推荐

