Pandas groupby diff

Así que mi dataframe se ve así:

from pandas.compat import StringIO d = StringIO(''' date,site,country,score 2018-01-01,google,us,100 2018-01-01,google,ch,50 2018-01-02,google,us,70 2018-01-03,google,us,60 2018-01-02,google,ch,10 2018-01-01,fb,us,50 2018-01-02,fb,us,55 2018-01-03,fb,us,100 2018-01-01,fb,es,100 2018-01-02,fb,gb,100 ''') df = pd.read_csv(d, sep=",") 

Cada sitio tiene una puntuación diferente dependiendo del país. Estoy tratando de encontrar la diferencia de puntuación de 1/3/5 día para cada combinación de sitio / país.

La salida debe ser:

 date,site,country,score,1_day_diff 2018-01-01,google,ch,50,0 2018-01-02,google,ch,10,-40 2018-01-01,google,us,100,0 2018-01-02,google,us,70,-30 2018-01-03,google,us,60,-10 2018-01-01,fb,es,100,0 2018-01-02,fb,gb,100,0 2018-01-01,fb,us,50,0 2018-01-02,fb,us,55,5 2018-01-03,fb,us,100,45 

Primero traté de clasificar por sitio / país / fecha, luego agrupándolos por sitio y país, pero no puedo envolver mi cabeza para obtener una diferencia de un objeto agrupado.

Primero, ordene el DataFrame y luego todo lo que necesita es groupby.diff() :

 df = df.sort_values(by=['site', 'country', 'date']) df['diff'] = df.groupby(['site', 'country'])['score'].diff().fillna(0) df Out: date site country score diff 8 2018-01-01 fb es 100 0.0 9 2018-01-02 fb gb 100 0.0 5 2018-01-01 fb us 50 0.0 6 2018-01-02 fb us 55 5.0 7 2018-01-03 fb us 100 45.0 1 2018-01-01 google ch 50 0.0 4 2018-01-02 google ch 10 -40.0 0 2018-01-01 google us 100 0.0 2 2018-01-02 google us 70 -30.0 3 2018-01-03 google us 60 -10.0 

sort_values no admite pedidos arbitrarios. Si necesita ordenar de forma arbitraria (google antes de fb, por ejemplo), debe almacenarlos en una colección y establecer su columna como categórica. Luego, sort_values ​​respetará el orden que proporcionaste allí.