Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫在groupby中排名靠前_Python_Pandas_Group By - Fatal编程技术网

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。干净多了!这也快了很多