我的数据框按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
答案 0 :(得分:1)
首先,我们检查它是否与diff
连续重复,并且对于0
和X1
两者的差是否等于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()
然后通过shift
和cumsum
创建唯一组,进行汇总并再次设置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