我有2个数据框
dataframe1:
index cust_id rank opt
0 customer_1 1 test1
2 customer_1 2 test3
3 customer_1 3 test4
4 customer_2 1 test1
5 customer_2 2 test4
7 customer_2 3 test3
9 customer_3 1 test3
10 customer_3 2 test4
11 customer_3 3 test1
dataframe2:
index cust_id rank opt
1 customer_1 1 new_opt
2 customer_2 2 new_opt
3 customer_3 3 new_opt
我想将这两个数据帧合并在一起,并得到如下输出:
index cust_id rank opt
0 customer_1 1 new_opt
1 customer_1 2 test1
2 customer_1 3 test3
3 customer_1 4 test4
4 customer_2 1 test1
5 customer_2 2 new_opt
6 customer_2 3 test4
7 customer_2 4 test3
8 customer_3 1 test3
9 customer_3 2 test4
10 customer_3 3 new_opt
11 customer_3 4 test1
基本上,我希望dataframe2中的等级保持不变,并且将dataframe2附加在一起后,其余选项的dataframe1中的等级会增加。
任何帮助表示赞赏!
最佳答案
两者均具有dense
排名,将第一帧concat
放在第二帧上,然后进行排序。这样可以确保df2
中的行出现在df1
中类似排名的行上方。然后,新排名是组内的cumcount
df = pd.concat([df2, df1], ignore_index=True).sort_values(['cust_id', 'rank'])
df['rank'] = df.groupby('cust_id').cumcount()+1
cust_id rank opt
0 customer_1 1 new_opt
3 customer_1 2 test1
4 customer_1 3 test3
5 customer_1 4 test4
6 customer_2 1 test1
1 customer_2 2 new_opt
7 customer_2 3 test4
8 customer_2 4 test3
9 customer_3 1 test3
10 customer_3 2 test4
2 customer_3 3 new_opt
11 customer_3 4 test1
相反,如果您通常希望将
1
添加到排名高于new_opt
的所有行的排名中,而无论初始排名如何,我们都可以使用groupby.apply
来实现。第一步相同,但现在我们使用cummax
将new_opt
后的所有行加1。这将导致与上述相同的输出。df = pd.concat([df2, df1], ignore_index=True).sort_values(['cust_id', 'rank'])
df['rank'] = (df['rank']
+ (df.opt.eq('new_opt')
.groupby(df.cust_id)
.apply(lambda x: x.shift().cummax()).fillna(0).astype(int)))
关于python - 将2个数据帧 append 在一起,并在 append 时增加等级,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58631184/