pandas 中 groupby 中的排名

2024-03-13

我有一个典型的“面板数据”(在计量经济学术语中,不是 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_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)

这假设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(使用前将#替换为@)

pandas 中 groupby 中的排名 的相关文章

随机推荐