Python 熊猫在groupby中排名靠前
我有一个典型的“面板数据”(用计量经济学术语,而不是熊猫面板对象)。数据框有一个Python 熊猫在groupby中排名靠前,python,pandas,group-by,Python,Pandas,Group By,我有一个典型的“面板数据”(用计量经济学术语,而不是熊猫面板对象)。数据框有一个Date列和一个ID列,以及包含特定值的其他列。对于每个日期,我需要根据V1将ID横截面排序为10组(十分位),并创建一个名为rank\u col(取值1到10)的新列来标识等级。然后将所有rank1,rank2,…rank10在时间上进行汇总,以获得一些统计数据,如平均值,标准值 这可以通过以下代码在SAS中轻松实现,并说明了我的目的: proc sort data=df; by Date; proc ra
Date
列和一个ID
列,以及包含特定值的其他列。对于每个日期,我需要根据V1将ID横截面排序为10组(十分位),并创建一个名为rank\u 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
为每行保留正确的位置
如果你有更好的方法,请发帖子,或者指出这个方法中的错误
谢谢
编辑:如果执行以下操作,只需返回一个新的列即可:
>>> 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
它可以更简单,而不需要单独的foo
In [782]: df.groupby('Date')['V1'].transform(lambda x: pd.qcut(x, 10, labels=False))
Out[782]:
0 6
1 4
2 3
3 8
4 9
5 1
6 0
7 0
8 1
9 7
10 8
11 5
12 2
13 4
14 9
Name: V1, dtype: int64
分配给列
In [783]: df['ranks'] = df.groupby('Date')['V1'].transform(pd.qcut, 10, labels=False)
In [784]: df
Out[784]:
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
细节
In [786]: df
Out[786]:
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
这是一个合理的方法。您可以稍微更改apply以仅返回列
序列。这将允许您仅将一个新的ranks
列分配给原始数据帧,作为groupby/apply
的结果。“但你的方式很好,”卡尔德说。谢谢你。我刚刚发现,如果我能首先根据groupby变量对数据帧进行排序,groupby操作会快得多。@KarlD。我试图只返回秩序列dec
,groupby会将整个序列附加到每个行列(单元格)中。如果您不介意,我可以添加一个版本,只在您的答案中返回一列?@KarlD。干净多了!这也快了很多