Python 通过多个字段进行分组,然后进行区分

Python 通过多个字段进行分组,然后进行区分,python,pandas,group-by,Python,Pandas,Group By,因此,我的数据框如下所示: 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

因此,我的数据框如下所示:

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=",")
每个
站点
都有不同的分数,具体取决于
国家
。我试图找出每个
站点
/
国家
组合的
得分
s的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

我首先尝试按
站点
/
国家
/
日期
排序,然后按
站点
国家
分组,但我无法从分组对象中获得差异。

首先,对数据帧进行排序,然后只需
groupby.diff()


排序\u值
不支持任意排序。如果您需要任意排序(例如google before fb),则需要将它们存储在集合中,并将列设置为分类。然后对值进行排序将遵循您在此处提供的顺序。

首先,对数据帧进行排序,然后只需
groupby.diff()



排序\u值
不支持任意排序。如果您需要任意排序(例如google before fb),则需要将它们存储在集合中,并将列设置为分类。然后,sort_值将遵守您在那里提供的顺序。

如何获取用于python3的StringIO?我正试图重现你的生活problem@JulianRachman使用
io
好的,等等,我正在尝试重新创建您的problem@Alex@ayhan我已经编辑了预期的输出。本质上,
es
gb
将出现在
us
@Craig之前,因为您可以添加
df.sort_值(按=['site'、'country'、'date'],升序=[False、True、True])
和@ayhan的回答如何获得python3的StringIO?我正试图重现你的生活problem@JulianRachman使用
io
好的,等等,我正在尝试重新创建您的problem@Alex@ayhan我已经编辑了预期的输出。本质上,
es
gb
将出现在
us
@Craig之前,因为您可以添加
df.sort_值(按=['site'、'country'、'date'],升序=[False、True、True])
和@ayhan的回答出于任何原因,上面的行不断抛出错误,如
TypeError:diff()获取了意外的关键字参数“axis”
。然而,这是有效的:
df.groupby(['site','country'])['score'].transform(pd.Series.diff).fillna(0)
@JohanDettmar出现此异常的原因是,您在一个只有一列而没有数据帧的系列上调用了
diff()
。序列
diff()
没有
axis
参数,因为只有一个轴。为什么不按日期分组?diff认识日期吗?我没有发现任何关于自动检测日期@Auss的信息,因为我们正在试图找出不同日期的这些值之间的差异。如果我们也按日期分组,每组将有一个单独的观察结果。相反,我们需要在每个组中进行多个观察(针对不同的日期),以便找到这些日期的值之间的差异。无论出于何种原因,上面的行不断抛出错误,如
TypeError:diff()得到了一个意外的关键字参数“axis”
。然而,这是有效的:
df.groupby(['site','country'])['score'].transform(pd.Series.diff).fillna(0)
@JohanDettmar出现此异常的原因是,您在一个只有一列而没有数据帧的系列上调用了
diff()
。序列
diff()
没有
axis
参数,因为只有一个轴。为什么不按日期分组?diff认识日期吗?我没有发现任何关于自动检测日期@Auss的信息,因为我们正在试图找出不同日期的这些值之间的差异。如果我们也按日期分组,每组将有一个单独的观察结果。相反,我们需要在每组中进行多次观察(针对不同的日期),以便我们能够找到这些日期的值之间的差异。
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