繁体   English   中英

Pandas:从左到右和从右到左交替 iterrows()

[英]Pandas: Alternating iterrows() from left to right and right to left

我对编程还很陌生,到目前为止,这个问题已经“超出了我的工资水平”,因此非常感谢您对此提供的任何帮助!

我有一个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

我不确定如何从左到右遍历第一行,然后从右到左遍历第二行。

非常感谢您的帮助!

我认为在这种情况下,最好显示至少 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

此时,草稿订单现在由索引正确保存,您可以删除 Order 列(我只是将它留在那里,以便更清楚地了解代码的工作原理)。

此解决方案通过 iterrows 遍历 DataFrame 中的每一行,如果行是奇数行[::(-1 if n % 2 else 1)] ,则反转该行,然后将结果与已被选中的iterrows列表连接在一起通过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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM