按ID和日期汇总特定变量中具有相同值的行-Pandas

时间:2019-09-14 11:56:56

标签: pandas

我的数据框按ID,日期和时间索引和排序,还包括X1,X2和Y变量。 我想在X1和X2中汇总在每个(ID,日期)索引中彼此彼此相邻的相同值的行。 聚合将是Y变量的总和,我想留在较早(按时间)“发生”的行中。

数据说明:

ID  date        time    X1  X2  Y
A   07/27/2019  10:00   2   3   100
                12:00   2   3   200
                14:00   2   4   50
    08/27/2019  11:00   2   4   10
                12:00   2   3   20
                13:00   2   3   30
                14:00   2   4   40
B   06/28/2019  16:00   2   4   100
                17:00   2   3   80
                18:00   2   3   80

预期结果:

ID  date        time    X1  X2  Y
A   07/27/2019  10:00   2   3   300
                14:00   2   4   50
    08/27/2019  11:00   2   4   10
                12:00   2   3   50
                14:00   2   4   40
B   06/28/2019  16:00   2   4   100
                17:00   2   3   160

2 个答案:

答案 0 :(得分:1)

首先,我们检查它是否与diff连续重复,并且对于0X1两者的差是否等于X2,这是连续重复,我们需要总结一下。

然后我们在GroupBy的{​​{1}}和ID, date, X1, X2上使用sum

Y

输出

s = df[['X1', 'X2']].diff(-1).eq(0).all(axis=1).cumsum()

grpd = df.groupby(['ID', 'date', 'X1', 'X2', s], sort=False).agg({'time':'first',
                                                                  'Y':'sum'}).reset_index(level=[2,3])

答案 1 :(得分:1)

我认为输入值中有MultiIndex

print (df.index)
MultiIndex([('A', '07/27/2019', '10:00'),
            ('A', '07/27/2019', '12:00'),
            ('A', '07/27/2019', '14:00'),
            ('A', '08/27/2019', '11:00'),
            ('A', '08/27/2019', '12:00'),
            ('A', '08/27/2019', '13:00'),
            ('A', '08/27/2019', '14:00'),
            ('B', '06/28/2019', '16:00'),
            ('B', '06/28/2019', '17:00'),
            ('B', '06/28/2019', '18:00')],
           names=['ID', 'date', 'time'])

因此,首先使用reset_index

df = df.reset_index()

然后通过shiftcumsum创建唯一组,进行汇总并再次设置MultiIndex

g = df[['X1', 'X2']].ne(df[['X1', 'X2']].shift()).any(1).cumsum()
df = (df.groupby(['ID', 'date', 'X1', 'X2', g], sort=False)
       .agg({'time':'first', 'Y':'sum'})
       .set_index('time', append=True)
       .reset_index(level=4, drop=True)
       .reset_index(['X1','X2']))
print (df)

                     X1  X2    Y
ID date       time              
A  07/27/2019 10:00   2   3  300
              14:00   2   4   50
   08/27/2019 11:00   2   4   10
              12:00   2   3   50
              14:00   2   4   40
B  06/28/2019 16:00   2   4  100
              17:00   2   3  160