按列分组对比相似行值:按描述分组两年及金额遇技术难题
解决按描述分组对比两年金额的问题
Hey there! Let's tackle this grouping and pivoting problem you're facing—sounds like you want to turn row-level year/amount data into a side-by-side comparison for each description, right? I've got you covered with two common tool solutions below.
假设你的原始数据结构
先举个典型的原始数据例子,方便我们对应解决方案:
import pandas as pd raw_data = pd.DataFrame({ 'description': ['Office Supplies', 'Office Supplies', 'Travel', 'Travel', 'Equipment'], 'year': [2022, 2023, 2022, 2023, 2022], 'amount': [1500, 1800, 2200, 2500, 3000] })
用Python Pandas实现转换
这是处理这类表格转换最常用的方式,用pivot或pivot_table就能轻松搞定:
场景1:每个描述+年份组合唯一
如果你的数据里,同一个description对应同一年份只有一条记录,直接用pivot:
# 按description分组,将年份转为列,金额作为对应值 pivoted_df = raw_data.pivot(index='description', columns='year', values='amount').reset_index() # 给列名设置更清晰的命名 pivoted_df.columns = ['description', '2022_amount', '2023_amount'] # 处理缺失值(比如某个描述只有单年份数据) pivoted_df = pivoted_df.fillna(0) print(pivoted_df)
场景2:存在重复的描述+年份组合
如果同一个描述同一年有多条金额记录,用pivot_table加聚合函数(比如求和、均值):
pivoted_df = raw_data.pivot_table( index='description', columns='year', values='amount', aggfunc='sum' # 可替换为'mean'/'max'等聚合方式 ).reset_index() pivoted_df.columns = ['description', '2022_amount', '2023_amount'] pivoted_df = pivoted_df.fillna(0)
用SQL实现转换
如果你是在数据库里处理数据,用CASE WHEN配合GROUP BY就能生成对比列:
SELECT description, SUM(CASE WHEN year = 2022 THEN amount ELSE 0 END) AS 2022_amount, SUM(CASE WHEN year = 2023 THEN amount ELSE 0 END) AS 2023_amount FROM your_table_name GROUP BY description;
这个写法会自动把没有对应年份的描述金额填充为0,也可以根据需求调整(比如换成NULL)。
如果还有特殊情况(比如要对比更多年份、处理复杂的分组规则),随时说,我们再调整方案!
内容的提问来源于stack exchange,提问作者BrewBegin
相关产品推荐
相关产品推荐

