将排名应用于Pandas Groupby中的每个组



假设我有一个简单的数据集(即df1(,如下所示:

ID     Name     Max_FileID
--------------------------------
1      Dog          3
1      Dog          3
1      Dog          3
2      Bird         1
3      Cat          5
3      Cat          5

我想按ID对数据集进行分组(我对此没有问题(:

df1.groupby('ID')

然后使用Max_FileID+Rank添加一个新列。

结果应该像这个

ID     Name     Max_FileID     Rank
------------------------------------------
1      Dog          3           4
1      Dog          3           5
1      Dog          3           6
2      Bird         1           2
3      Cat          5           6
3      Cat          5           7

为了更好地理解我试图实现的目标,这里有一个SQL等价物:

SELECT
ID,
Name,
Max_FileID,
Max_FileID + ROW_NUMBER() OVER(PARTITION BY ID ORDER BY ID)
FROM df1

此外,我还创建了一个自定义功能:

def sequential_ranking(self, iterable, max_id):
try:
max_id = max_id - 1
seq_nums = list()
for num in iterable:
max_id += 1
seq_nums.append(max_id)
return seq_nums

不确定是否有内置功能。提前感谢!!

您可以使用DataFrameGroupBy.rank函数,该函数返回组中的秩值,如果将方法参数指定给first,则将按列在组中的顺序分配列。

您可以使用此:

df["Rank"] = df["Max_FileID"] + df.groupby("ID")["Max_FileID"].rank(method="first").astype(int)

结果:

>>> print(df)
ID  Name  Max_FileID  Rank
0   1   Dog           3     4
1   1   Dog           3     5
2   1   Dog           3     6
3   2  Bird           1     2
4   3   Cat           5     6
5   3   Cat           5     7

您可以使用groupby,然后通过添加np.arange:来应用自定义转换

df['Rank'] = df.groupby('ID')['Max_FileID'].transform(lambda x: x+np.arange(1, len(x)+1))

您给出的示例有点令人困惑,因为您说"然后使用Max_FileID+Rank添加一个新列",但该示例将新列称为"Rank",尽管它看起来像Rank和Max_FileID的总和。

我认为你只需要使用groupby().rank()。如果不需要,你可以去掉中间的"rank"列。

df['rank'] = df.groupby('ID').rank(method='first').astype(int)
df['newcol'] = df['Max_FileID'] + df['rank']

输出

df
=== Output: ===
ID  Name  Max_FileID  rank  newcol
0   1   Dog           3     1       4
1   1   Dog           3     2       5
2   1   Dog           3     3       6
3   2  Bird           1     1       2
4   3   Cat           5     1       6
5   3   Cat           5     2       7

最新更新