добавляем 2 кадра данных вместе и увеличиваем ранги при добавлении - PullRequest
2 голосов
/ 30 октября 2019

У меня есть 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 оставался таким же, а ранг в dataframe1 увеличивался для оставшихся опций после добавления фреймов данных.

любая помощь приветствуется!

1 Ответ

3 голосов
/ 30 октября 2019

С рейтингом 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, чтобы добавить 1 ко всем строкам в группе после new_opt. Это приводит к тому же результату, что и выше.

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)))
...