python pandas group-by

python - Pandas groupby diff



group-by (1)

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 (por ejemplo, google antes de fb), debe almacenarlos en una colección y establecer su columna como categórica. Entonces sort_values ​​respetará el orden que proporcionó allí.

Entonces 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 según el país. Estoy tratando de encontrar la diferencia de puntajes de 1/3/5 días 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 intenté ordenar por sitio / país / fecha, luego agrupar por sitio y país, pero no puedo entender cómo obtener una diferencia de un objeto agrupado.