【问题标题】:How to partially transpose pandas a dataframe如何将熊猫部分转置为数据框
【发布时间】:2019-10-22 13:24:58
【问题描述】:

我有一个与here 类似的问题。我想部分转置熊猫数据框。我得到了一个类似于以下内容的数据框:

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)

它显示了学生以及他们在给定年份的给定科目的计划和实际表现(以及增量)。在此示例中,年份是列。行中是否显示计划的、实际的或学生表现的增量在行中给出。

我想将它转换为计划、实际和增量成为列的方式。 因此,我的目标是以下结构:

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

【问题讨论】:

  • 您正在寻找数据透视表

标签: python pandas dataframe transpose


【解决方案1】:

DataFrame.set_indexDataFrame.stackSeries.unstack 一起使用第三级:

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

另一种解决方案,如果不首先使用DataFrame.meltDataFrame.pivot_table 进行可能的聚合:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 2015-06-11
    • 2019-07-01
    • 2013-09-05
    • 2023-03-18
    相关资源
    最近更新 更多