我有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来实现。第一步相同,但现在我们使用cummaxnew_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/

10-10 00:32