Python 比较groupby中不同行的值
我想打印每一次不一致,其中a开始与上一行的结束不同,按“id”列分组。在以下数据中,最后一行是不一致的情况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
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%清晰?当然。我用预期的结果更新了问题。好:)我向上投票