use*_*212 8 python group-by pandas
我有一个典型的"面板数据"(在计量经济学术语中,不是pandas面板对象).数据框有一Date列和一ID列,以及包含特定值的其他列.对于每个日期,我需要将基于V1的ID进行横截面排序为10组(十分位数),并创建一个名为rank_col(取值1到10)的新列来识别排名.然后将所有rank1,rank2,... rank10汇集在一起以获得一些统计数据,如mean,std.
这可以通过以下代码在SAS中轻松完成,它还说明了我的目的:
proc sort data=df;
by Date;
proc rank data=df out=df_ranked groups=10;
var V1;
ranks rank_col;
by Date;
run;
Run Code Online (Sandbox Code Playgroud)
df_rankeddf除了它有更多的列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)
Run Code Online (Sandbox Code Playgroud)
这假定dec保留每行的正确位置.
如果您有更好的方法,请发布,或指出此方法中的任何错误.
谢谢!
编辑: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
Run Code Online (Sandbox Code Playgroud)