Ну, вы можете отсортировать ваши данные (как у вас уже есть), а затем рассчитать разницу как разницу между count и count.shift ().
Это различие мы присваиваем фрейму данных, где отбрасываем все дублированные строки и столбцы, которые нам не интересны:
import pandas as pd
data = '''\
count w c d y
131 1 dir mob 2017
244 1 dir mob 2018
311 1 org mob 2017
332 1 org mob 2018
212 2 dir dsk 2017
311 2 dir dsk 2018
401 2 org mob 2017
283 2 org mob 2018'''
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')
df.sort_values(by=['w','c','d','y'], inplace=True) # <--- sort values
diff = (df['count'].shift(-1) - df['count'])/df['count'][::2] # <--- calculate % change
dfnew = df.drop_duplicates(('w','c','d')).drop(['y','count'],axis=1).assign(diff=diff)
print(dfnew)
Возвращает:
w c d diff
0 1 dir mob 0.862595
2 1 org mob 0.067524
4 2 dir dsk 0.466981
6 2 org mob -0.294264
Вы можете добавить этот верификатор, чтобы убедиться, что вы получили количество правильных столбцов:
sum(df[['w','c','d']].duplicated()) == len(df)/2 # <-- This should return True