一致地以相同的值聚合熊猫数据框

Pau*_*hin 2 python indexing group-by aggregate pandas

我试图通过汇总一列从熊猫数据框中排除不必要的行。数据框如下所示:

df1=pd.DataFrame({'date':[20191121]*10,
   'time':[100000]*10,
   'last':[64131,64131,64130,64130,64130,64131,64131,64132,64130,64130],
   'vol':[1]*10})

print(df1)
       date    time   last  vol
0  20191121  100000  64131    1
1  20191121  100000  64131    1
2  20191121  100000  64130    1
3  20191121  100000  64130    1
4  20191121  100000  64130    1
5  20191121  100000  64131    1
6  20191121  100000  64131    1
7  20191121  100000  64132    1
8  20191121  100000  64130    1
9  20191121  100000  64130    1
Run Code Online (Sandbox Code Playgroud)

我想要这样的数据框:

df2=pd.DataFrame({'date':[20191121]*5,
   'time':[100000]*5,
   'last':[64131,64130,64131,64132,64130],
   'vol':[2,3,2,1,2]})

print(df2)
       date    time   last  vol
0  20191121  100000  64131    2
1  20191121  100000  64130    3
2  20191121  100000  64131    2
3  20191121  100000  64132    1
4  20191121  100000  64130    2
Run Code Online (Sandbox Code Playgroud)

你能帮我解决这个任务吗?

jez*_*ael 5

您可以聚合sum,但也有必要为lastto的连续值添加helper系列groupby

g = df1['last'].ne(df1['last'].shift()).cumsum()
df = df1.groupby(['date','time','last', g], sort=False, as_index=False)['vol'].sum()
print(df)
       date    time   last  vol
0  20191121  100000  64131    2
1  20191121  100000  64130    3
2  20191121  100000  64131    2
3  20191121  100000  64132    1
4  20191121  100000  64130    2
Run Code Online (Sandbox Code Playgroud)

如果要使用所有3列的连续值:

c = ['date','time','last']
g = df1[c].ne(df1[c].shift()).any(axis=1).cumsum()

df = df1.groupby(c + [g], sort=False, as_index=False)['vol'].sum()
print(df)
       date    time   last  vol
0  20191121  100000  64131    2
1  20191121  100000  64130    3
2  20191121  100000  64131    2
3  20191121  100000  64132    1
4  20191121  100000  64130    2
Run Code Online (Sandbox Code Playgroud)