web-dev-qa-db-ja.com

Pandas groupby diff

だから私のデータフレームは次のようになります:

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=",")

国によってスコアはサイトごとに異なります。各サイト/国の組み合わせのスコアの1/3/5日間の違いを見つけようとしています。

出力は次のようになります。

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

私は最初にサイト/国/日付で並べ替えてから、サイトと国でグループ化しようとしましたが、グループ化されたオブジェクトとの違いを理解することに集中できません。

11
Craig

最初にDataFrameを並べ替え、次に必要なのは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は任意の順序付けをサポートしていません。任意にソートする必要がある場合(たとえば、fbの前にグーグル)、それらをコレクションに格納し、列をカテゴリーとして設定する必要があります。次に、sort_valuesはそこで指定した順序を尊重します。

17
ayhan