Python 比较groupby中不同行的值

Python 比较groupby中不同行的值,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我想打印每一次不一致,其中a开始与上一行的结束不同,按“id”列分组。在以下数据中,最后一行是不一致的情况 start,end,id 0,2,1 1,5,2 2,10,1 5,7,2 7,9,2 11,13,1 我使用for循环成功地做到了这一点: def检查一致性(df): grouped_df=df.groupby('id')) 对于键,分组在分组的_df中: df=pd.DataFrame() df['start']=组['start'].iloc[1:] df['end']=组['en

我想打印每一次不一致,其中a开始与上一行的结束不同,按“id”列分组。在以下数据中,最后一行是不一致的情况

start,end,id
0,2,1
1,5,2
2,10,1
5,7,2
7,9,2
11,13,1
我使用for循环成功地做到了这一点:

def检查一致性(df):
grouped_df=df.groupby('id'))
对于键,分组在分组的_df中:
df=pd.DataFrame()
df['start']=组['start'].iloc[1:]
df['end']=组['end'].shift().iloc[1:]
一致性=df['start']==df['end']
如果不是全部(一致):
打印(键)
打印(df[consistent==False])
有没有一种方法可以在不使用for循环和创建辅助数据帧的情况下实现相同的目标

编辑:以下是预期输出

数据帧:

df = pd.DataFrame({'start': [0,1,2,5,7,11], 'end': [2,5,10,7,9,13], 'id': [1,2,1,2,2,1]})
预期产出:

1
   start   end
5     11  10.0

首先,我们按
id
排序。然后制作一个掩码,将每个
start
与前一行
end
进行比较,并按
id
分组

对于每个组,掩码的第一个条目默认为
True
,因为它没有前一行,并且不用于我们的提取

最后,我们使用带布尔掩码的否定的
.loc
选择掩码为False的行(
start
不等于前一行
end

df1 = df.sort_values('id', kind='mergesort')    # Merge Sort for stable sort to maintain sequence other than sort key
mask = (df1['start']
           .eq(df1['end'].shift())
           .groupby(df1['id']).transform(lambda x: [True] + x.iloc[1:].tolist())
       )
df1.loc[~mask]
输出:

   start     end  id
5     11      13   1

您能否添加预期输出以使其100%清晰?当然。我用预期的结果更新了问题。好:)我向上投票