Pandas 遍历 DataFrame 行对

Lxn*_*ndr 3 python loops dataframe pandas

如何遍历 Pandas DataFrame 的成对行?

例如:

content = [(1,2,[1,3]),(3,4,[2,4]),(5,6,[6,9]),(7,8,[9,10])]
df = pd.DataFrame( content, columns=["a","b","interval"])
print df
Run Code Online (Sandbox Code Playgroud)

输出:

   a  b interval
0  1  2   [1, 3]
1  3  4   [2, 4]
2  5  6   [6, 9]
3  7  8  [9, 10]
Run Code Online (Sandbox Code Playgroud)

现在我想做类似的事情

for (indx1,row1), (indx2,row2) in df.?
    print "row1:\n", row1
    print "row2:\n", row2
    print "\n"
Run Code Online (Sandbox Code Playgroud)

哪个应该输出

row1:
a    1
b    2
interval    [1,3]
Name: 0, dtype: int64
row2:
a    3
b    4
interval    [2,4]
Name: 1, dtype: int64

row1:
a    3
b    4
interval    [2,4]
Name: 1, dtype: int64
row2:
a    5
b    6
interval    [6,9]
Name: 2, dtype: int64

row1:
a    5
b    6
interval    [6,9]
Name: 2, dtype: int64
row2:
a    7
b    8
interval    [9,10]
Name: 3, dtype: int64
Run Code Online (Sandbox Code Playgroud)

有没有内置的方法来实现这一目标?我查看了 df.groupby(df.index // 2) 和 df.itertuples 但这些方法似乎都没有做我想要的。

编辑: 总体目标是获取一个布尔值列表,指示“间隔”列中的间隔是否重叠。在上面的例子中,列表将是

overlaps = [True, False, False]
Run Code Online (Sandbox Code Playgroud)

所以每对一个布尔值。

Hal*_*Ali 8

移动数据帧并将其连接回原始使用,axis=1以便每个间隔和下一个间隔在同一行中

df_merged = pd.concat([df, df.shift(-1).add_prefix('next_')], axis=1)
df_merged
#Out:
   a  b interval     next_a     next_b    next_interval
0  1  2   [1, 3]        3.0        4.0           [2, 4]
1  3  4   [2, 4]        5.0        6.0           [6, 9]
2  5  6   [6, 9]        7.0        8.0          [9, 10]
3  7  8  [9, 10]        NaN        NaN              NaN
Run Code Online (Sandbox Code Playgroud)

定义一个与您的列表表示一起使用的相交函数并应用于合并的数据框,忽略shifted_interval为空的最后一行

def intersects(left, right):
    return left[1] > right[0]

df_merged[:-1].apply(lambda x: intersects(x.interval, x.next_interval), axis=1)
#Out:
0     True
1    False
2    False
dtype: bool
Run Code Online (Sandbox Code Playgroud)


Ben*_*n.T 2

如果你想保持循环for,使用zipanditerrows可能是一种方法

for (indx1,row1),(indx2,row2) in zip(df[:-1].iterrows(),df[1:].iterrows()):
    print "row1:\n", row1
    print "row2:\n", row2
    print "\n"
Run Code Online (Sandbox Code Playgroud)

要同时访问下一行,请在一行后使用 开始第二个迭代行df[1:].iterrows()。然后你就可以按照你想要的方式得到输出。

row1:
a    1
b    2
Name: 0, dtype: int64
row2:
a    3
b    4
Name: 1, dtype: int64


row1:
a    3
b    4
Name: 1, dtype: int64
row2:
a    5
b    6
Name: 2, dtype: int64


row1:
a    5
b    6
Name: 2, dtype: int64
row2:
a    7
b    8
Name: 3, dtype: int64
Run Code Online (Sandbox Code Playgroud)

但正如 @RafaelC 所说,for循环可能不是解决一般问题的最佳方法。