簡體   English   中英

使用 Pandas 將 dataframe 從長轉換為寬

[英]Converting the dataframe from long to wide using Pandas

我的樣本df看起來像這樣

student_id,      year,       grade,    school   
1001           20002001        1         abc  
1001           20012002        2         abc 
1001           20022003        3         abc 
1001           20032004        4         abc  

1002           19992000        2         abc    
1002           20002001        3         abc         
1002           20012002        4         abc         

1003           20022003        4         abc          

1004           20022003        3         abc         
1004           20032004        4         abc         

df當前為long格式。 我想要做的是將數據轉換為wide格式,應該如下所示:

student_id,    grade_19992000,    grade_20002001,    grade_20012002,    grade_20022003,    grade_20032004,    school_19992000,   school_19992000,   school_20012002,    school_20022003,    school_20032004     
1001                NaN                  1                  2                  3              4                       NaN                 abc                 abc                 abc                 abc
1002                2                    3                  4                 NaN            NaN                     abc                 abc                 abc                 NaN                 NaN 
1003                NaN                 NaN                NaN                 4             NaN                     NaN                 NaN                 NaN                  abc                    NaN 
1004                NaN                 NaN                NaN                 3             4                     NaN                 NaN                 abc                  abc                    NaN 

這不是重復的,也與其他問題無關。 我嘗試了所有可用的選項。

我做了什么?

  • 我嘗試使用df.pivot(index='', columns'', values='')但它沒有按照我的意願格式化數據
  • 例如:對於同yearstudent_id ,它為另一個student_id創建了一個具有相同列名的新列,依此類推......

有人可以提供一些關於如何實現我想要的 output 的見解嗎?

你可以pivot ; 只需要 2 列作為值:

out = df.pivot('student_id', 'year', ['grade', 'school'])
out.columns = [f'{x}_{y}' for x,y in out.columns]

Output:

           grade_19992000 grade_20002001 grade_20012002 grade_20022003  \
student_id                                                               
1001                  NaN              1              2              3   
1002                    2              3              4            NaN   
1003                  NaN            NaN            NaN              4   
1004                  NaN            NaN            NaN              3   

           grade_20032004 school_19992000 school_20002001 school_20012002  \
student_id                                                                  
1001                    4             NaN             abc             abc   
1002                  NaN             abc             abc             abc   
1003                  NaN             NaN             NaN             NaN   
1004                    4             NaN             NaN             NaN   

           school_20022003 school_20032004  
student_id                                  
1001                   abc             abc  
1002                   NaN             NaN  
1003                   abc             NaN  
1004                   abc             abc  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM