我对编程很新,到目前为止,这个问题已经“高于我的薪水”,所以非常感谢您给予的任何帮助!
我有一个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
我不确定如何从左到右迭代第一行,然后从右到左遍历第二行。
非常感谢您的帮助!
答案 0 :(得分: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整除)然后排序:< / p>
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
此时草稿订单现在由索引正确保存,您可以删除订单栏(我只是将其留在那里,以使代码更有效地运作)。
答案 1 :(得分:0)
此解决方案通过iterrows
遍历DataFrame中的每一行,如果它是奇数行[::(-1 if n % 2 else 1)]
则反转该行,然后将结果与已重复的Drafters列表连接起来通过df.columns.tolist() * df.shape[0]
在DataFrame中的行数。玩家和起草人通过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