【问题标题】:Rearrange Panda-Dataframe from Cross-Section to Panel Data [duplicate]将 Panda-Dataframe 从横截面重新排列到面板数据 [重复]
【发布时间】:2019-12-31 15:29:08
【问题描述】:

我想将横截面重新排列成面板数据。

很遗憾,我无法使用 pd.meltpd.pivot 公式重新排列它。我也在堆栈溢出社区中搜索了解决方案,但没有找到与问题匹配的答案。

当前数据有以下形式:

ID  FA_17   FA_18   TA_17   TA_18   OR_17   OR_18
-----------------------------------------------------
ID1  590     304     313     682     671     499
ID2  832     344     482     223     580     789
ID3  598     138     125     712     775     761

最后它们应该变成如下顺序:

     FA      TA      OR
ID1 FA_17   TA_17    OR_17
ID1 FA_18   TA_18    OR_18
ID2 FA_17   TA_17    OR_17
ID2 FA_18   TA_18    OR_18
ID3 FA_17   TA_17    OR_17
ID3 FA_18   TA_18    OR_18

非常感谢您!

【问题讨论】:

    标签: python pandas dataframe data-manipulation


    【解决方案1】:

    通过DataFrame.set_index为所有没有_的列创建索引,然后通过Series.str.split创建MultiIndex in columns并通过DataFrame.stack重塑,最后通过DataFrame.reset_indexdrop=True删除MultiIndex in index的第二级:

    df = df.set_index('ID')
    df.columns = df.columns.str.split('_', expand=True)
    df = df.stack().reset_index(level=1, drop=True)
    
    print (df)
          FA   OR   TA
    ID                
    ID1  590  671  313
    ID1  304  499  682
    ID2  832  580  482
    ID2  344  789  223
    ID3  598  775  125
    ID3  138  761  712
    

    或使用wide_to_long:

    df1 = (pd.wide_to_long(df, stubnames=['FA','TA','OR'], j='p', i='ID', sep='_')
             .reset_index(level=1, drop=True)
             .sort_index())
    print (df1)
          FA   TA   OR
    ID                
    ID1  590  313  671
    ID1  304  682  499
    ID2  832  482  580
    ID2  344  223  789
    ID3  598  125  775
    ID3  138  712  761
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-05-25
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多