如何将同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)
运行后你会得到这样的结果:
| id | year_2017 | marks_2017 | year_2018 | marks_2018 | Difference |
|---|---|---|---|---|---|
| 1 | 2017 | 80 | 2018 | 100 | 20 |
| 2 | 2017 | 60 | 2018 | 70 | 10 |
| 3 | 2017 | 500 | 2018 | 600 | 100 |
方案二:长格式转换法(适合大批量数据)
如果你的数据量很大,或者原始数据是从文件(比如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
相关产品推荐
相关产品推荐

