我有一个典型的“面板数据”(在计量经济学术语中,不是 pandas 面板对象)。数据框有一个Date
列和一个ID
列,以及包含某些值的其他列。对于每个日期,我需要根据 V1 对 ID 进行横断面排名,分为 10 组(十分位数),并创建一个名为的新列rank_col
(取值 1 到 10)来确定排名。然后汇集一段时间内的所有rank1、rank2、...rank10,以获得一些统计数据,例如平均值、标准差。
这可以通过以下代码在 SAS 中轻松完成,它也说明了我的目的:
proc sort data=df;
by Date;
proc rank data=df out=df_ranked groups=10;
var V1;
ranks rank_col;
by Date;
run;
df_ranked
与df
除了它有更多的列称为rank_col
其中包含每行所属的排名组。
抱歉,我没有示例数据来显示结构,需要一个真正的长数据来说明。但 SAS 代码准确地表明了我所追求的。
感谢您的帮助!
我刚刚发现的一种方法:
def grouping(data):
dec=pd.qcut(data['V1'],10,labels=False)
data['ranks']=dec
return data
df_ranked=df.groupby('Date').apply(grouping)
这假设dec
保留每一行的正确位置。
如果您有更好的方法,请留言,或者指出该方法中的错误。
Thanks!
Edit:您可以只返回一个新的ranks
如果您执行类似以下操作的列:
>>> df
Date id V1
0 2013-01-01 1 10
1 2013-01-01 2 8
2 2013-01-01 3 6
3 2013-01-01 4 11
4 2013-01-01 5 13
5 2013-01-01 6 4
6 2013-01-01 7 2
7 2013-02-01 1 1
8 2013-02-01 2 3
9 2013-02-01 3 9
10 2013-02-01 4 11
11 2013-02-01 5 7
12 2013-02-01 6 4
13 2013-02-01 7 6
14 2013-02-01 8 14
>>> foo = lambda x: pd.Series(pd.qcut(x,10,labels=False),index=x.index)
>>> df['ranks'] = df.groupby('Date')['V1'].apply(foo)
>>> df
Date id V1 ranks
0 2013-01-01 1 10 6
1 2013-01-01 2 8 4
2 2013-01-01 3 6 3
3 2013-01-01 4 11 8
4 2013-01-01 5 13 9
5 2013-01-01 6 4 1
6 2013-01-01 7 2 0
7 2013-02-01 1 1 0
8 2013-02-01 2 3 1
9 2013-02-01 3 9 7
10 2013-02-01 4 11 8
11 2013-02-01 5 7 5
12 2013-02-01 6 4 2
13 2013-02-01 7 6 4
14 2013-02-01 8 14 9
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)