这个问题类似于this one,但是对于我来说,我需要为每个组应用一个返回Series而不是单个值的函数-这个问题与sum
进行聚合,但是我需要使用rank
(所以区别就像agg
和transform
之间)。
我有一段时间的公司数据。这将生成一些类似于我的用例的伪数据:
import numpy as np
import pandas as pd
dates = pd.date_range('1926', '2020', freq='M')
ndates = len(dates)
nfirms = 5000
cols = list('ABCDE')
df = pd.DataFrame(np.random.randn(nfirms*ndates,len(cols)),
index=np.tile(dates,nfirms),
columns=cols)
df.insert(0, 'id', np.repeat(np.arange(nfirms), ndates))
我需要计算每个日期(索引)中列E
的排名,但要保留列id
。
如果我仅使用groupby和.rank
,我会得到:
df.groupby(level=0)['E'].rank()
1926-01-31 3226.0
1926-02-28 1042.0
1926-03-31 1611.0
1926-04-30 2591.0
1926-05-31 30.0
...
2019-08-31 1973.0
2019-09-30 227.0
2019-10-31 4381.0
2019-11-30 1654.0
2019-12-31 1572.0
Name: E, Length: 5640000, dtype: float64
此维度与df
相同,但是我不确定在索引上合并是安全的-我确实也需要在id
列上进行合并。我可以假设顺序保持不变吗?
如果输出中的顺序与输出中的顺序相同,我想我可以这样做:
df['ranks'] = df.groupby(level=0)['E'].rank()
但是,这似乎有些奇怪,我认为可以在groupby输出中包括其他列。
(我也不知道调用.rank()
是否等效于.transform('rank')
。)