2015-06-20 156 views
2

我很新的編程,到目前爲止,這個問題已經'超過我的薪酬等級',所以任何幫助你可以給這個非常感謝!大熊貓:從左到右和從右到左交替排列()從左到右

我有一個DataFrame對象,看起來像這樣:

   Dan   Mike   Dave 
0 Adrian Peterson Eddie Lacy Jamaal Charles 
1 Calvin Johnson Leveon Bell  Dez Bryant 

我想創建一個新的DataFrame對象,看起來像這樣:

   Player  Drafter 
0 Adrian Peterson   Dan 
1  Eddie Lacy   Mike 
2 Jamaal Charles   Dave 
3  Dez Bryant   Dave 
4  Leveon Bell   Mike 
5 Calvin Johnson   Dan 

我不知道如何遍歷通過第一行,從左到右,然後從右到左通過第二行。

非常感謝您的幫助!

回答

1

我認爲,在這種情況下,這是很好的表現至少3輪,以檢查代碼(假設你想要的東西比僅僅2輪更普遍的),所以我會擴大樣本數據:

   Dan   Mike   Dave 
0 Adrian Peterson Eddie Lacy Jamaal Charles 
1 Calvin Johnson Leveon Bell  Dez Bryant 
2  Tom Brady Lionel Messi Lebron James 

首先,使用stack()來獲得暫定的訂單。

df2 = df.stack().reset_index().reset_index() 
df2.columns = ['Order','Round','Drafter','Player'] 

    Order Round Drafter   Player 
0  0  0  Dan Adrian Peterson 
1  1  0 Mike  Eddie Lacy 
2  2  0 Dave Jamaal Charles 
3  3  1  Dan Calvin Johnson 
4  4  1 Mike  Leveon Bell 
5  5  1 Dave  Dez Bryant 
6  6  2  Dan  Tom Brady 
7  7  2 Mike  Lionel Messi 
8  8  2 Dave  Lebron James 

注意,爲了爲回合0和2是正確的,但不是1,一種相當簡單的方法來解決的順序爲第1輪是由負1(更具體地所有不被2整除輪)和繁殖然後排序:

df2['Order'] = np.where(df2['Round'].mod(2)==1, -df2['Order'], df2['Order']) 

df3 = df2.sort(['Round','Order']).reset_index(drop=True) 

    Order Round Drafter   Player 
0  0  0  Dan Adrian Peterson 
1  1  0 Mike  Eddie Lacy 
2  2  0 Dave Jamaal Charles 
3  -5  1 Dave  Dez Bryant 
4  -4  1 Mike  Leveon Bell 
5  -3  1  Dan Calvin Johnson 
6  6  2  Dan  Tom Brady 
7  7  2 Mike  Lionel Messi 
8  8  2 Dave  Lebron James 

此時選秀順序現在正確地索引舉行,您可以刪除訂單列(我只是離開它有使其更明顯的代碼是如何工作)。

0

將該溶液遍歷在數據幀的每一行通過iterrows,反轉如果奇數行[::(-1 if n % 2 else 1)]的行,然後將結果與已在數據幀被重複由行數起草者的列表一起串接通過df.columns.tolist() * df.shape[0]。玩家和起草者通過zip函數加入,然後傳遞給DataFrame構造函數。

draft = pd.DataFrame(zip(pd.concat([pd.Series(row.values)[::(-1 if n % 2 else 1)] 
            for n, row in df.iterrows()], 
            ignore_index=True), 
         df.columns.tolist() * df.shape[0]), 
        columns=['Player', 'Drafter']) 
draft['round'] = 1 + draft.index.values // df.shape[1] 

>>> draft 
      Player Drafter round 
0 Adrian Peterson  Dan  1 
1  Eddie Lacy Mike  1 
2 Jamaal Charles Dave  1 
3  Dez Bryant  Dan  2 
4  Leveon Bell Mike  2 
5 Calvin Johnson Dave  2 
6  Tom Brady  Dan  3 
7  Lionel Messi Mike  3 
8  Lebron James Dave  3 
+0

謝謝你,這是一個很好的答案!唯一的一點是我希望能保持Drafter與Player的匹配。但非常感謝你的幫助! –