2015-06-20 140 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的匹配。但非常感谢你的帮助! –