比较groupby中不同行的值

2024-06-14 17:32:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我想打印每一次不一致,其中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 check_consistency(df):
    grouped_df = df.groupby('id')
    for key, group in grouped_df:
        df = pd.DataFrame()
        df['start'] = group['start'].iloc[1:]
        df['end'] = group['end'].shift().iloc[1:]
        consistent = df['start'] == df['end']
        if not all(consistent):
            print(key)
            print(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

Tags: 数据keyiddataframedfforgroup情况
1条回答
网友
1楼 · 发布于 2024-06-14 17:32:48

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

对于每个组,mask的第一个条目默认为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

相关问题 更多 >