如何用Pandas简洁合并年、月列生成日期列?
刚好遇到过类似的需求!你原来用循环的方法虽然能实现,但确实不够简洁,这里给你两个更Pythonic的一行写法,而且性能也更优:
方案一:使用Pandas矢量化方法(推荐)
这是效率最高的写法,因为Pandas的pd.to_datetime支持直接解析多列组合的日期,完全不需要循环:
import pandas as pd from datetime import date # 初始化你的DataFrame ID = ['A', 'B', 'C', 'D', 'E', 'F'] YEAR = [2017, 2017, 2017, 2017, 2017, 2017] MONTH = [1, 2, 3, 4, 5, 6] df = pd.DataFrame({'ID': ID, 'YEAR': YEAR, 'MONTH': MONTH}) # 一行生成DATE列 df['DATE'] = pd.to_datetime(df[['YEAR', 'MONTH']].assign(DAY=1))
这里用assign(DAY=1)临时添加一个值为1的日列,pd.to_datetime会自动把这三列组合成标准的日期格式。
方案二:使用apply结合datetime.date
如果你更倾向于用datetime.date构造函数,也可以用apply一行搞定:
df['DATE'] = df.apply(lambda row: date(row['YEAR'], row['MONTH'], 1), axis=1)
axis=1表示按行遍历,每一行的YEAR和MONTH会被传入date函数生成日期对象。
最终效果
两种方法都能得到你想要的目标DataFrame:
+----+------+-------+------------+
| ID | YEAR | MONTH | DATE |
+----+------+-------+------------+
| A | 2017 | 1 | 2017-01-01 |
| B | 2017 | 2 | 2017-02-01 |
| C | 2017 | 3 | 2017-03-01 |
| D | 2017 | 4 | 2017-04-01 |
| E | 2017 | 5 | 2017-05-01 |
| F | 2017 | 6 | 2017-06-01 |
+----+------+-------+------------+
小提示:如果你的数据量很大,优先选方案一,因为矢量化操作比apply(本质是逐行循环)的执行速度快很多。
内容的提问来源于stack exchange,提问作者Sam

