我有一个数据框架:
Name Rank Months
A 'A3' 2
A 'A3' 2
A 'A2' 3
A 'A2' 3
A 'A2' 3
B 'A1' 4
B 'A1' 4
B 'A1' 4
B 'A1' 4
C 'A3' 2
C 'A3' 2
C 'A2' 1
根据特定Name的月数和Rank条件创建具有增量值的新列的最有效方法是什么?所以基本上输出如下:
Name Rank Months NewIncremental
A 'A3' 2 'P4'
A 'A3' 2 'P5'
A 'A2' 3 'P1'
A 'A2' 3 'P2'
A 'A2' 3 'P3'
B 'A1' 4 'P1'
B 'A1' 4 'P2'
B 'A1' 4 'P3'
B 'A1' 4 'P4'
C 'A3' 2 'P2'
C 'A3' 2 'P3'
C 'A2' 1 'P1'
条件就是秩序,A1->A2->A3。这意味着如果有一个排名为A2的名称,我将分配较低的增量值。我想基于这个排序会有帮助吧?
编辑:编辑的顺序,所以我需要提供任意顺序的排名
一种方法:
ranks = df.sort_values(by=["Rank"],
key=lambda x: x.str.replace(r"D+", "", regex=True).astype(int))
.groupby("Name").transform("cumcount") + 1
ranks = ranks.apply("P{}".format)
df["NewIncremental"] = ranks
print(df)
Name Rank Months NewIncremental
0 A A1 2 P1
1 A A1 2 P2
2 A A2 3 P3
3 A A2 3 P4
4 A A2 3 P5
5 B A1 4 P1
6 B A1 4 P2
7 B A1 4 P3
8 B A1 4 P4
9 C A3 2 P2
10 C A3 2 P3
11 C A2 1 P1
一步一步
# sort df by the given criteria, then group-by
sorted_by_rank = df.sort_values(by=["Rank"], key=lambda x: x.str.replace(r"D+", "", regex=True).astype(int))
# get the ranks and apply the expected format
ranks = sorted_by_rank.groupby("Name").transform("cumcount") + 1
ranks = ranks.apply("P{}".format)
# assign the new column
df["NewIncremental"] = ranks
print(df)
这能解决你的问题吗?
df['NewIncrement'] = 'P' + df.sort_values(['Name', 'Rank']).groupby('Name').rank(method="first", ascending=True).astype(int).astype(str)
您可以简单地使用rank
:
df["new"] = "P"+df.groupby("Name")["Rank"].rank(method="first").astype(int).astype(str)
print (df)
Name Rank Months new
0 A 'A1' 2 P1
1 A 'A1' 2 P2
2 A 'A2' 3 P3
3 A 'A2' 3 P4
4 A 'A2' 3 P5
5 B 'A1' 4 P1
6 B 'A1' 4 P2
7 B 'A1' 4 P3
8 B 'A1' 4 P4
9 C 'A3' 2 P2
10 C 'A3' 2 P3
11 C 'A2' 1 P1