如何在data frame中基于year列创建名为decade的年代标签新列
实现方案
以下提供Python(pandas)和R两种常用数据处理环境的实现方法:
Python(pandas 环境)
核心思路是先将年份向下取整到年代起始值(比如1965取整为1960),再通过字典映射得到对应的文本标签:
import pandas as pd # 自定义年代和对应标签的映射关系,可按需增删 decade_label_map = { 1960: "sixty", 1970: "seventy", 1980: "eighty", 1990: "ninety", 2000: "twenty_hundred", 2010: "twenty_ten", 2020: "twenty_twenty" } # 生成decade列,不在映射范围内的年份默认返回NaN,可通过fillna设置默认值 df["decade"] = (df["year"] // 10 * 10).map(decade_label_map).fillna("other")
R 环境
tidyverse(dplyr)写法
用case_when做条件判断,逻辑直观易修改:
library(dplyr) df <- df %>% mutate(decade = case_when( year %in% 1960:1969 ~ "sixty", year %in% 1970:1979 ~ "seventy", year %in% 1980:1989 ~ "eighty", year %in% 1990:1999 ~ "ninety", year %in% 2000:2009 ~ "twenty_hundred", year %in% 2010:2019 ~ "twenty_ten", year %in% 2020:2029 ~ "twenty_twenty", .default = "other" ))
基础R写法
不需要加载第三方包,适合轻量处理场景:
# 计算年份对应的年代起始值 df$decade_start <- floor(df$year / 10) * 10 # 映射得到标签,默认生成factor类型,可用as.character转成字符型 df$decade <- factor( df$decade_start, levels = c(1960, 1970, 1980, 1990, 2000, 2010, 2020), labels = c("sixty", "seventy", "eighty", "ninety", "twenty_hundred", "twenty_ten", "twenty_twenty") )
内容的提问来源于stack exchange,提问作者ash1
相关产品推荐
相关产品推荐

