Python 如何部分转置数据帧
我有一个类似的问题。我想部分转置熊猫数据帧。我得到了一个数据框,看起来类似于以下内容:Python 如何部分转置数据帧,python,pandas,dataframe,transpose,Python,Pandas,Dataframe,Transpose,我有一个类似的问题。我想部分转置熊猫数据帧。我得到了一个数据框,看起来类似于以下内容: data = [{"Student" : "john", "Subject" : 'Math', 'Plan_Actual_Delta' : 'Plan' , "2009" : 100, "2010" : 100}, {"Student" : "john", "Subject" : 'Math', 'Plan_Actual_Delta' : 'Actual' ,"2009" : 80,
data = [{"Student" : "john", "Subject" : 'Math', 'Plan_Actual_Delta' : 'Plan' , "2009" : 100, "2010" : 100},
{"Student" : "john", "Subject" : 'Math', 'Plan_Actual_Delta' : 'Actual' ,"2009" : 80, "2010" : 100},
{"Student" : "john", "Subject" : 'Math' , 'Plan_Actual_Delta' : 'Delta' ,"2009" : -20, "2010" : 0},
{"Student" : "lisa", "Subject" : 'Math', 'Plan_Actual_Delta' : 'Plan' ,"2009" : 80, "2010" : 100},
{"Student" : "lisa", "Subject" : 'Math', 'Plan_Actual_Delta' : 'Actual' ,"2009" : 75, "2010" : 100},
{"Student" : "lisa", "Subject" : 'Math', 'Plan_Actual_Delta' : 'Delta' ,"2009" : -5, "2010" : 0}]
df = pd.DataFrame(data)
它显示了学生以及他们在给定年份中针对给定科目的计划和实际表现(以及增量)。在本例中,年份是列。行中给出了学生表现的计划、实际或增量
我想用一种方式将其转换为plan、actual和delta列。
因此,我的目标是以下结构:
data = [{"Student" : "john", "Subject" : 'Math', 'Year': '2009', 'Plan':100, 'Actual':80, 'Delta': -20},
{"Student" : "john", "Subject" : 'Math', 'Year': '2010', 'Plan':100, 'Actual':100, 'Delta': 0},
{"Student" : "lisa", "Subject" : 'Math', 'Year': '2009', 'Plan':80, 'Actual':75, 'Delta': -5},
{"Student" : "lisa", "Subject" : 'Math', 'Year': '2010', 'Plan':100, 'Actual':100, 'Delta': 0}]
df = pd.DataFrame(data)
你会怎么做?提前感谢/R与第三级重塑一起使用:
df = (df.set_index(['Student','Subject','Plan_Actual_Delta'])
.rename_axis('Year', axis=1)
.stack()
.unstack(2)
.reset_index()
.rename_axis(None, axis=1))
print (df)
Student Subject Year Actual Delta Plan
0 john Math 2009 80 -20 100
1 john Math 2010 100 0 100
2 lisa Math 2009 75 -5 80
3 lisa Math 2010 100 0 100
另一种解决方案,如果不首先使用和进行可能的聚合:
您正在寻找透视表
df = (df.melt(['Student','Subject','Plan_Actual_Delta'], var_name='Year')
.pivot_table(index=['Student','Subject','Year'],
columns='Plan_Actual_Delta',
values='value',
aggfunc='mean')
.reset_index()
.rename_axis(None, axis=1)
)
print (df)
Student Subject Year Actual Delta Plan
0 john Math 2009 80 -20 100
1 john Math 2010 100 0 100
2 lisa Math 2009 75 -5 80
3 lisa Math 2010 100 0 100