2017-10-12 71 views
1

這與this answer有些類似,但我的問題有點不同。熊貓:編碼行值/變換數據幀

我的數據框:

df=pd.DataFrame([{'date': '2017-01-01', 'id': 'google', 'category': 1, 'Score1': 51, 'Score2': 531}, 
     {'date': '2017-01-01', 'id': 'google', 'category': 2, 'Score1': 592, 'Score2': 152}, 
     {'date': '2017-01-01', 'id': 'google', 'category': 5, 'Score1': 55, 'Score2': 255}, 
     {'date': '2017-01-01', 'id': 'yahoo', 'category': 7, 'Score1': 597, 'Score2': 357}, 
     {'date': '2017-01-01', 'id': 'yahoo', 'category': 8, 'Score1': 58, 'Score2': 58}, 
     {'date': '2017-01-02', 'id': 'google', 'category': 5, 'Score1': 795, 'Score2': 455}, 
     {'date': '2017-01-02', 'id': 'google', 'category': 1, 'Score1': 71, 'Score2': 751}, 
     {'date': '2017-01-02', 'id': 'google', 'category': 2, 'Score1': 792, 'Score2': 352}, 
     {'date': '2017-01-02', 'id': 'yahoo', 'category': 7, 'Score1': 77, 'Score2': 957}, 
     {'date': '2017-01-02', 'id': 'yahoo', 'category': 8, 'Score1': 798, 'Score2': 358} 
     ]) 

,看起來像這樣:

  date  id category Score1 Score2 
0 2017-01-01 google   1  51  531 
1 2017-01-01 google   2  592  152 
2 2017-01-01 google   5  55  255 
3 2017-01-01 yahoo   7  597  357 
4 2017-01-01 yahoo   8  58  58 
5 2017-01-02 google   5  795  455 
6 2017-01-02 google   1  71  751 
7 2017-01-02 google   2  792  352 
8 2017-01-02 yahoo   7  77  957 
9 2017-01-02 yahoo   8  798  358 

我需要轉換成數據幀,看起來像這樣的:

date id cat1_score1 cat2_score1 cat5_score1 cat7_score1 cat8_score1 cat1_score2 cat2_score2 cat5_score2 cat7_score2 cat8_score2 
1/1/17 google 51  592   55   0   0   531  152  255   0   0 
1/1/17 yahoo  0  0   0   597   58    0   0   0   357  58 
1/2/17 google 71  792  795   0   0   751  352  455   0   0 
1/2/17 yahoo  0   0   0   77   798   0   0   0   957  358 

需要說明這裏是類別的數量可以從idid不等。還可能有一個需要考慮的輔助ID列。 我可能enumerateid列的值,但然後我將如何轉換數據幀相應?

回答

3

讓我們重塑這樣的:

df_out = df.set_index(['date', 'id', 'category']).stack().unstack([2, 3]).fillna(0) 
df_out.columns = df_out.columns.map('{0[0]}_{0[1]}'.format) 
df_out = df_out.add_prefix('cat').reset_index() 
print(df_out) 

輸出:

  date  id cat1_Score1 cat1_Score2 cat2_Score1 cat2_Score2 \ 
0 2017-01-01 google   51.0  531.0  592.0  152.0 
1 2017-01-01 yahoo   0.0   0.0   0.0   0.0 
2 2017-01-02 google   71.0  751.0  792.0  352.0 
3 2017-01-02 yahoo   0.0   0.0   0.0   0.0 

    cat5_Score1 cat5_Score2 cat7_Score1 cat7_Score2 cat8_Score1 \ 
0   55.0  255.0   0.0   0.0   0.0 
1   0.0   0.0  597.0  357.0   58.0 
2  795.0  455.0   0.0   0.0   0.0 
3   0.0   0.0   77.0  957.0  798.0 

    cat8_Score2 
0   0.0 
1   58.0 
2   0.0 
3  358.0 

說明:在一切,但得分列首先​​,然後用stack垂直對齊所有得分。接下來,使用unstack將分類和分數轉換爲列,並將fillna轉爲零。使用列map將列級別組合到一個級別,並將「貓」列組合到列中。最後,reset_index將所有列從索引中取回到數據框中。

+0

感謝@Scott - 這似乎已從數據幀列中刪除了'date'和'id',儘管 – Craig

+0

您可以reset_index結束以將其返回到數據框。 –

+0

@克雷格更新.... –