【问题标题】:Nested loop over dataframe rows数据框行的嵌套循环
【发布时间】:2023-01-11 23:45:47
【问题描述】:

考虑到内部循环从 outer_row + 1 开始这一事实,我想对数据帧行执行嵌套循环。如果我使用

for o_index, o_row in df.iterrows():
    L1 = o_row['Home']
    L2 = o_row['Block']
    for i_index, i_row in df.iterrows():
        L3 = i_row['Home']
        L4 = i_row['Block']

如您所见,在第一次迭代中,i_index 与 o_index 相同。但是,我希望 o_index 为 0,i_index 为 1。我该怎么做?

示例:假设这样的数据框:

     Cycle      Home     Block
0     100       1         400
1     130       1         500
2     200       2         200
3     300       1         300
4     350       3         100

迭代应按以下顺序进行:

0 -> 1, 2, 3, 4

1 -> 2、3、4

2 -> 3, 4

3 -> 4

4 -> 没有

在每次内部迭代中,我将比较 L1 和 L3,如果它们相等,则计算 abs(L2-L4) 并将其推入列表。

【问题讨论】:

  • 你到底想达到什么目的?几乎可以肯定的是,使用嵌套的iterrows循环是错误的方法。请举出具体例子。
  • 理想情况下,don't loop at all。你打算用这些价值观做什么?您可以使用 .shift() 来偏移行并一次处理它们。
  • @mahmood 你现在能举个例子吗手术你会表演吗?
  • @mozway 请查看更新帖子。
  • @mahmood 我看过了,但你没有解释你在计算什么。可以向量化吗?

标签: python pandas


【解决方案1】:

无需通过测试进行迭代,您要做的是计算同一 Home 的 Block 组合。所以就这样做:

from itertools import combinations

out = [abs(L2-L4) for _, g in df.groupby('Home')
       for L2, L4 in combinations(g['Block'], r=2)]

输出:

[100, 100, 200]

【讨论】:

    【解决方案2】:

    对于您的具体问题,我猜 df.iterrows() 可能不是最佳的... 您应该考虑仅使用索引和 df.iloc 进行迭代。

    for o_index in range(len(df)):
        o_row = df.iloc[o_index]
        L1 = o_row['Home']
        L2 = o_row['Block']
        for i_index in range(o_index + 1, len(df)):
            i_row = df.iloc[i_index]
            L3 = i_row['Home']
            L4 = i_row['Block']
    

    否则,如果你真的想使用df.iterrows(),这个解决方案应该有效:

    for o_index, o_row in df.iterrows():
        L1 = o_row['Home']
        L2 = o_row['Block']
        for i_index, i_row in df.iloc[o_index+1:].iterrows():
            L3 = i_row['Home']
            L4 = i_row['Block']
    

    【讨论】:

    • 在不知道 OP 想要做什么的情况下,循环仍然是一种糟糕的方法也并非不可能;)
    • @mozway 我同意你的看法,但问题的标题是Nested loop over dataframe rows,所以我想为此提供一个答案。我想剩下的不在这个问题的范围内
    • 我写了一个例子。您提出的方法似乎不错。谢谢你。
    猜你喜欢
    • 2019-03-31
    • 2022-08-15
    • 2021-02-05
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 2015-06-05
    • 2020-04-03
    相关资源
    最近更新 更多