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),则需要将它们存储在集合中,并将列设置为分类。然后,sort_值将遵守您在那里提供的顺序。如何获取用于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的信息,因为我们正在试图找出不同日期的这些值之间的差异。如果我们也按日期分组,每组将有一个单独的观察结果。相反,我们需要在每组中进行多次观察(针对不同的日期),以便我们能够找到这些日期的值之间的差异。
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