You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将同id不同年份的marks相减结果存入单列并规整数据?

问题解决:计算同一ID的年度分数差值并规整数据

嘿,我来帮你搞定这个数据处理需求!先看看你给的原始数据:

id year marks id year marks
1 2017 80 1 2018 100
2 2017 60 2 2018 70
3 2017 500 3 2018 600

你需要把每个ID的2018年分数减去2017年的,得到差值列,还要把每个ID的信息整成单行。用Python的pandas来处理是最方便的,我给你两种可行的方案:


方案一:拆分合并法(适合小批量数据)

这种方法直接把原始数据拆成2017和2018两个数据集,合并后计算差值,逻辑很直观:

import pandas as pd

# 把原始数据转换成列表格式
data = [
    [1, 2017, 80, 1, 2018, 100],
    [2, 2017, 60, 2, 2018, 70],
    [3, 2017, 500, 3, 2018, 600]
]

# 拆分出2017年的记录
df_2017 = pd.DataFrame(data, columns=['id', 'year_2017', 'marks_2017', 'tmp_id', 'tmp_year', 'tmp_marks'])[['id', 'year_2017', 'marks_2017']]
# 拆分出2018年的记录,并重命名ID列方便合并
df_2018 = pd.DataFrame(data, columns=['tmp_id', 'tmp_year', 'tmp_marks', 'id', 'year_2018', 'marks_2018'])[['id', 'year_2018', 'marks_2018']]

# 按ID合并两个年度的数据
merged_df = pd.merge(df_2017, df_2018, on='id')

# 计算2018 - 2017的分数差值
merged_df['Difference'] = merged_df['marks_2018'] - merged_df['marks_2017']

# 整理成最终的单行结构
final_result = merged_df[['id', 'year_2017', 'marks_2017', 'year_2018', 'marks_2018', 'Difference']]
print(final_result)

运行后你会得到这样的结果:

idyear_2017marks_2017year_2018marks_2018Difference
1201780201810020
220176020187010
320175002018600100

方案二:长格式转换法(适合大批量数据)

如果你的数据量很大,或者原始数据是从文件(比如CSV)读取的,用这种转长格式再转宽格式的方法更通用:

import pandas as pd

# 假设你从CSV读取原始数据,这里模拟读取后的DataFrame
df_raw = pd.DataFrame(
    [[1, 2017, 80, 1, 2018, 100], [2, 2017, 60, 2, 2018, 70], [3, 2017, 500, 3, 2018, 600]],
    columns=['id1', 'year1', 'marks1', 'id2', 'year2', 'marks2']
)

# 把宽格式数据转成长格式,统一ID、年份、分数字段
df_long = pd.concat([
    df_raw[['id1', 'year1', 'marks1']].rename(columns={'id1':'id', 'year1':'year', 'marks1':'marks'}),
    df_raw[['id2', 'year2', 'marks2']].rename(columns={'id2':'id', 'year2':'year', 'marks2':'marks'})
])

# 把长格式转成宽格式,每个ID一行,包含两年的分数
df_wide = df_long.pivot(index='id', columns='year', values='marks').reset_index()
df_wide.columns = ['id', '2017_marks', '2018_marks']

# 计算差值
df_wide['Difference'] = df_wide['2018_marks'] - df_wide['2017_marks']
print(df_wide)

这个方案的好处是不管你原始数据里有多少个年度的记录,都能轻松扩展处理,而且代码更简洁。


内容的提问来源于stack exchange,提问作者newbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:01:54