如何为数据集新增列获取对应公司下一年的客户数量
实现方法
这个需求的核心逻辑是按公司维度分组,匹配每条记录对应下一年的客户数,根据你使用的工具不同,有以下几种常见实现方式:
1. Python Pandas 实现(表格数据处理最常用)
操作前先确保数据已经按公司、年份升序排列,避免顺序错乱导致匹配错误,核心是用分组偏移函数直接生成新列:
import pandas as pd # 初始化/读取你的数据集 df = pd.DataFrame({ "Company name": ["Company A", "Company B", "Company C"]*3, "Year": [2018,2018,2018,2019,2019,2019,2020,2020,2020], "Customers": [100,120,150,120,180,80,200,500,140] }) # 先按公司、年份排序,保证组内年份顺序正确 df = df.sort_values(by=["Company name", "Year"], ignore_index=True) # 分组向上偏移1位,得到下一年客户数 df["Customers next year"] = df.groupby("Company name")["Customers"].shift(-1)
执行后得到的结果和你给出的预期完全一致,没有下一年数据的2020年记录会自动填充为NaN(和示例中的NA等价)。
坑点提醒:如果你的数据集存在年份断层(比如某公司只有2018、2020年数据,缺2019年),直接用偏移方法会错误把2020年的客户数匹配给2018年,这种场景请用下面的关联匹配方法。
2. 关联匹配法(适配年份不连续场景)
通过构造辅助匹配列,严格按照「同公司、年份差为1」的规则做关联,不会出现年份断层的匹配错误:
# 构造用于匹配的辅助数据集 match_part = df[["Company name", "Year", "Customers"]].rename( columns={"Customers": "Customers next year"} ) match_part["Year"] = match_part["Year"] - 1 # 左关联匹配得到结果 df = df.merge( match_part[["Company name", "Year", "Customers next year"]], on=["Company name", "Year"], how="left" )
3. SQL 实现(数据库场景)
如果数据存储在支持窗口函数的数据库中,可以直接用LEAD窗口函数实现,逻辑和Pandas偏移一致:
SELECT `Company name`, `Year`, `Customers`, LEAD(`Customers`, 1) OVER ( PARTITION BY `Company name` ORDER BY `Year` ASC ) AS `Customers next year` FROM your_table;
如果需要适配年份断层场景,可以改用左关联写法:
SELECT t1.`Company name`, t1.`Year`, t1.`Customers`, t2.`Customers` AS `Customers next year` FROM your_table t1 LEFT JOIN your_table t2 ON t1.`Company name` = t2.`Company name` AND t2.`Year` = t1.`Year` + 1;
内容的提问来源于stack exchange,提问作者larzz010
相关产品推荐
相关产品推荐

