Python中分组匹配实际值(y)与预测值(yhat)的分类数据处理
Pandas透视表无法匹配yhat与y的对应行
原始数据
TimePeriod Groups Entity Category Year Quarter Predictions Value 1/1/2021 CO UK Model_Q1_2022 2021 1 yhat 25379.12223 1/1/2021 CO UK Model_Q4_2021 2021 1 y 19915.88 1/1/2021 CO UK Model_Q3_2021 2021 1 y 19915.88 1/1/2021 CO UK Model_Q3_2021 2021 1 yhat 24199.99065 1/1/2021 CO UK Model_Q4_2021 2021 1 yhat 24308.29262 1/1/2021 CO UK Model_Q2_2021 2021 1 yhat 24627.24434 1/1/2021 CO UK Model_Q1_2022 2021 1 y 19915.88 1/1/2021 CO UK Model_Q2_2021 2021 1 y 19915.88
尝试的代码及问题
使用pivot_table时,虽生成了y和yhat列,但每个Category对应两行,无法将预测值与实际值匹配到同一行:
df.pivot_table(index=df.columns[:-2].tolist(), columns=['Predictions'], values='Value').reset_index().rename_axis(columns=None)
数据类型信息
<class 'pandas.core.frame.DataFrame'> Int64Index: 8 entries, 19535 to 140390 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 TimePeriod 8 non-null object 1 Groups 8 non-null object 2 Entity 8 non-null object 5 Currency 8 non-null object 6 Category 8 non-null object 7 Year 8 non-null int64 8 Quarter 8 non-null int64 9 Predictions 8 non-null object 10 Value 8 non-null float64 dtypes: float64(1), int64(2), object(9)
期望输出
TimePeriod Groups Entity Category Year Quarter yhat y 1/1/2021 CO UK Model_Q1_2022 2021 1 25379.12223 19915.88 1/1/2021 CO UK Model_Q2_2021 2021 1 24627.24434 19915.88 1/1/2021 CO UK Model_Q3_2021 2021 1 24199.99065 19915.88 1/1/2021 CO UK Model_Q4_2021 2021 1 24308.29262 19915.88
解决方案
问题根源在于index参数包含了Predictions列,导致透视时将其作为分组依据,拆分了行。只需将除Predictions和Value外的列设为索引即可:
方法一:修正pivot_table参数
# 明确指定索引列,排除Predictions和Value index_cols = ['TimePeriod', 'Groups', 'Entity', 'Category', 'Year', 'Quarter'] result = df.pivot_table(index=index_cols, columns='Predictions', values='Value').reset_index().rename_axis(columns=None)
方法二:使用pivot方法(更高效)
若每个分组下y和yhat唯一,用pivot更简洁:
result = df.pivot(index=['TimePeriod', 'Groups', 'Entity', 'Category', 'Year', 'Quarter'], columns='Predictions', values='Value').reset_index().rename_axis(columns=None)
两种方法均可将同一分组的y和yhat合并到同一行,得到目标格式。
内容的提问来源于stack exchange,提问作者user3459293
相关产品推荐
相关产品推荐

