Python Pandas-合并具有连续间隔的行

Python Pandas-合并具有连续间隔的行,python,pandas,Python,Pandas,我最近开始使用熊猫,几天来一直在这个问题上磕磕绊绊。我有一个带有间隔信息的数据帧,看起来有点像这样: df = pd.DataFrame({'RangeBegin' : [1,3,5,10,12,42,65], 'RangeEnd' : [2,4,7,11,41,54,100], 'Var1' : ['A','A','A','B','B','B','A'], 'Var2' : ['A','A','B

我最近开始使用熊猫,几天来一直在这个问题上磕磕绊绊。我有一个带有间隔信息的数据帧,看起来有点像这样:

    df = pd.DataFrame({'RangeBegin' : [1,3,5,10,12,42,65],
               'RangeEnd' : [2,4,7,11,41,54,100],
               'Var1' : ['A','A','A','B','B','B','A'],
               'Var2' : ['A','A','B','B','B','B','A']})

     RangeBegin  RangeEnd Var1 Var2
0           1         2    A    A
1           3         4    A    A
2           5         7    A    B
3          10        11    B    B
4          12        41    B    B
5          42        54    B    B
6          65       100    A    A
它是按范围开始排序的。我们的想法是以这样的方式结束:

       RangeBegin  RangeEnd Var1 Var2
0         1.0       4.0    A    A
2         5.0       7.0    A    B
3        10.0      54.0    B    B
6        65.0     100.0    A    A
其中,具有连续范围的每个“重复”(匹配的Var1和Var2)行聚合为一行。我正在考虑扩展这个算法来检测和处理重叠,但我想先让它正常工作

你看,我已经有了一个解决方案,通过使用iterrows逐行构建一个新的dataframe,但是在我的真实数据集上花费的时间太长了,我希望使用一个更矢量化的实现。 我已经查看了groupby,但找不到一组键(或应用于所述组的函数)来实现此功能

以下是我目前的实施情况:

def test():
    df = pd.DataFrame({'RangeBegin' : [1,3,5,10,12,42,65],
                   'RangeEnd' : [2,4,7,11,41,54,100],
                   'Var1' : ['A','A','A','B','B','B','A'],
                   'Var2' : ['A','A','B','B','B','B','A']})
    print(df)

    i = 0
    cols = df.columns
    aggData = pd.DataFrame(columns = cols)
    for row in df.iterrows():
        rowIndex, rowData = row
        #if our new dataframe is empty or its last row is not contiguous, append it
        if(aggData.empty or not duplicateContiguousRow(cols,rowData,aggData.loc[i])):
            aggData = aggData.append(rowData)
            i=rowIndex
        #otherwise, modify the last row
        else:
            aggData.loc[i,'RangeEnd'] = rowData['RangeEnd']
    print(aggData)

def duplicateContiguousRow(cols, row, aggDataRow):
    #first bool: are the ranges contiguous?
    contiguousBool = aggDataRow['RangeEnd']+1 == row['RangeBegin']
    if(not contiguousBool):
        return False

    #second bool: is this row a duplicate (minus range columns)?
    duplicateBool = True
    for col in cols:
        if(not duplicateBool):
            break
        elif col not in ['RangeBegin','RangeEnd']:
            #Nan != Nan
            duplicateBool = duplicateBool and (row[col] == aggDataRow[col] or (row[col]!=row[col] and aggDataRow[col]!=aggDataRow[col]))
    return duplicateBool


编辑:在我写这篇文章时,刚被问到。答案看起来很有希望

您可以使用
groupby
来实现这一目的,当您首次检测到:

将导致:

  Var1 Var2  block  RangeBegin  RangeEnd
0    A    A      1           1         4
1    A    A      4          65       100
2    A    B      2           5         7
3    B    B      3          10        54

然后,您可以按
块进行排序
以恢复原始顺序。

回答得很好,谢谢!只有一个问题,你有没有理由用Var1和Var2以及block来分组?我似乎得到了相同的结果分组块aloneOh不,它将从输出中删除这些列,如果你不应用一个函数,他们也。很好的答案,如果可能的话,将向上投票两次。我怎么也找不到一种方法来检测连续的块
  Var1 Var2  block  RangeBegin  RangeEnd
0    A    A      1           1         4
1    A    A      4          65       100
2    A    B      2           5         7
3    B    B      3          10        54