Pandas 通过保留其他列进行分组

Pandas 通过保留其他列进行分组,pandas,group-by,Pandas,Group By,这个问题类似于,但在我的例子中,我需要应用一个函数,为每个组返回一个序列而不是一个值-这个问题是关于使用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 c

这个问题类似于,但在我的例子中,我需要应用一个函数,为每个组返回一个序列而不是一个值-这个问题是关于使用
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')

应该可以安全地将代码分配回。是的,
rank()
transform('rank')
非常相似。这是因为
rank
返回每组中长度相同的序列。谢谢。“应该是”与“是”?;)是的,应该在这里,和现在一样。