Pandas中根据月份名称生成对应日期列的技术实现问题
问题描述
现有如下DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({'Date data':['actual september 2019', 'September'], 'Date':['2019.12','2019.12']})
需求:新增一列New_column,规则如下:
- 当
Date data的值为单独月份名称(如'September')时,设为2019.XX格式的对应日期(如'September'对应'2019.09') - 其余情况直接沿用
Date列的数值
期望输出:
df = pd.DataFrame({'Date data':['actual september 2019', 'September'], 'Date':['2019.12','2019.12'], 'New_column':['2019.12','2019.09']})
已定义变量:
month = ('April', 'December', 'February', 'January', 'July-August', 'June', 'March', 'May', 'November', ' October', 'September')
尝试执行的错误代码:
df.loc[df['Date data'].isin(month) , 'new_col'] = '2019.9
解决方案
步骤1:修正月份映射关系
把原月份元组改成带对应日期后缀的字典,同时修正原元组里' October'的前置空格问题,保证匹配准确:
month_map = { 'April': '2019.04', 'December': '2019.12', 'February': '2019.02', 'January': '2019.01', 'July-August': '2019.07-08', # 可根据需求调整格式 'June': '2019.06', 'March': '2019.03', 'May': '2019.05', 'November': '2019.11', 'October': '2019.10', # 去掉原前置空格 'September': '2019.09' }
步骤2:实现逻辑判断与赋值
用np.where完成条件判断和赋值,代码简洁高效:
import pandas as pd import numpy as np # 初始DataFrame df = pd.DataFrame({'Date data':['actual september 2019', 'September'], 'Date':['2019.12','2019.12']}) # 修正后的月份映射字典 month_map = { 'April': '2019.04', 'December': '2019.12', 'February': '2019.02', 'January': '2019.01', 'July-August': '2019.07-08', 'June': '2019.06', 'March': '2019.03', 'May': '2019.05', 'November': '2019.11', 'October': '2019.10', 'September': '2019.09' } # 新增列并赋值 df['New_column'] = np.where( df['Date data'].isin(month_map.keys()), # 判断是否为单独月份名称 df['Date data'].map(month_map), # 匹配对应日期格式 df['Date'] # 其余情况沿用Date列值 )
步骤3:验证结果
执行后df的输出与预期一致:
Date data Date New_column 0 actual september 2019 2019.12 2019.12 1 September 2019.12 2019.09
补充说明
- 原尝试代码的问题:字符串闭合错误(
'2019.9缺少右引号)、硬编码固定值无法匹配不同月份、未处理' October'的前置空格导致匹配失败。 - 若
July-August需要其他格式,直接修改字典中对应的值即可。
内容的提问来源于stack exchange,提问作者Gorkem Tunc
相关产品推荐
相关产品推荐

