假设我有一个简单的数据集(即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