熊猫遍历DataFrame行对

时间:2018-07-20 13:33:41

标签: python pandas loops dataframe

如何遍历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

输出:

   a  b interval
0  1  2   [1, 3]
1  3  4   [2, 4]
2  5  6   [6, 9]
3  7  8  [9, 10]

现在我想做类似的事情

for (indx1,row1), (indx2,row2) in df.?
    print "row1:\n", row1
    print "row2:\n", row2
    print "\n"

应输出

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

有内置的方法可以实现吗? 我看了df.groupby(df.index // 2)和df.itertuples,但是这些方法似乎都不符合我的要求。

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

overlaps = [True, False, False]

每对一个傻瓜。

4 个答案:

答案 0 :(得分:3)

移动数据框,并使用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

定义一个与您的列表表示形式配合使用的相交函数,并应用到合并的数据框中,而忽略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

答案 1 :(得分:0)

要获得显示的输出,请使用:

for row in df.index[:-1]:
    print 'row 1:'
    print df.iloc[row].squeeze()
    print 'row 2:'
    print df.iloc[row+1].squeeze()
    print

答案 2 :(得分:0)

您可以尝试iloc索引。

例如:

for i in range(df.shape[0] - 1):                        
    idx1,idx2=i,i+1                         
    row1,row2=df.iloc[idx1],df.iloc[idx2]   
    print(row1)                             
    print(row2)                             
    print()                                                                            

答案 3 :(得分:0)

如果要保持循环for,可以使用zipiterrows

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

要同时访问下一行,请使用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

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