Pandas更新DataFrame行的替代方法:避免冗长if-elif手动修改日期
问题背景
我有如下示例数据:
| 序号 | date | value |
|---|---|---|
| 0 | 2021/05 | 50 |
| 1 | 2021/06 | 60 |
| 2 | 2021/07 | 70 |
| 3 | 2021/08 | 80 |
| 4 | 2021/09 | 90 |
| 5 | 2021/10 | 100 |
我需要更新date列的数据,例如将2021/05修改为05/10/2021、2021/06修改为06/12/2021,所有行的新日期都需要手动指定。
目前我使用的写法如下,请问有没有更高效巧妙的实现方式?
for i in df.index: if df['date'][i] == '2021/05': df['date'][i] = '05/10/2021' elif df['date'][i] == '2021/06': df['date'][i] = '06/12/2021'
需要更新的行数超过一百条,上述写法会导致代码非常冗长,希望找到更简洁的方案。
解决方案
通过映射字典 + pandas内置批量替换方法即可实现需求,完全不用写循环和多分支判断:
- 先把所有旧日期到新日期的对应关系整理成一个字典,所有规则统一在字典里维护,100条数据只需要加100个键值对即可
- 直接调用
replace()方法完成批量替换,底层是向量化操作,比手写循环效率高得多,还能避免原生写法的链式赋值警告
示例代码如下:
# 定义新旧日期映射规则,所有需要替换的对应关系都在这里添加 date_map = { "2021/05": "05/10/2021", "2021/06": "06/12/2021", "2021/07": "这里填你要替换的2021/07对应的新日期", # 剩余需要替换的日期按上面的格式继续加即可 } # 批量替换,没有匹配到的日期会保留原值不修改 df["date"] = df["date"].replace(date_map)
如果你的需求是只有在映射里存在的日期才保留新值,不存在的直接设为空值,可以把最后一行替换为:
df["date"] = df["date"].map(date_map)
内容的提问来源于stack exchange,提问作者kobo
相关产品推荐
相关产品推荐

