Как добавить условие в split, применить объединение и повторить решение в каждой строке? - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть следующий pandas dataframe df:

cluster   tag   amount   name
1         0     200      Michael        
2         1     1200     John        
2         1     900      Daniel        
2         0     3000     David        
2         0     600      Jonny        
3         0     900      Denisse        
3         1     900      Mike        
3         1     3000     Kely        
3         0     2000     Devon  

Что мне нужно сделать, это добавить еще один столбец в df, который записывает для каждого row, name (из столбца имени), который имеет наибольшее значение amount, где tag равно 1. Другими словами, решение выглядит следующим образом:

cluster   tag   amount   name     highest_amount
1         0     200      Michael  NaN      
2         1     1200     John     John   
2         1     900      Daniel   John     
2         0     3000     David    John    
2         0     600      Jonny    John    
3         0     900      Denisse  Kely      
3         1     900      Mike     Kely   
3         1     3000     Kely     Kely   
3         0     2000     Devon    Kely

Я пробовал что-то вроде этого:

df.group('clusters')['name','amount'].transform('max')[df['tag']==1]

но проблема в том, что имя не повторяется в каждой строке.Это будет выглядеть так:

cluster   tag   amount   name     highest_amount
1         0     200      Michael  NaN      
2         1     1200     John     John   
2         1     900      Daniel   John     
2         0     3000     David    NaN    
2         0     600      Jonny    NaN    
3         0     900      Denisse  NaN      
3         1     900      Mike     Kely   
3         1     3000     Kely     Kely   
3         0     2000     Devon    NaN

Может кто-нибудь, пожалуйста, сообщите мне, как добавить условие с объединением с применением разделения, и повторить ли решение в каждой строке?

1 Ответ

0 голосов
/ 22 ноября 2018

Вы можете сделать это как двухэтапный процесс.Сначала вычислите ряд сопоставления, затем сопоставьте по кластеру:

s = df.query('tag == 1')\
      .sort_values('amount', ascending=False)\
      .drop_duplicates('cluster')\
      .set_index('cluster')['name']

df['highest_name'] = df['cluster'].map(s)

print(df)

   cluster  tag  amount     name highest_name
0        1    0     200  Michael          NaN
1        2    1    1200     John         John
2        2    1     900   Daniel         John
3        2    0    3000    David         John
4        2    0     600    Jonny         John
5        3    0     900  Denisse         Kely
6        3    1     900     Mike         Kely
7        3    1    3000     Kely         Kely
8        3    0    2000    Devon         Kely

Если вы хотите использовать groupby, вот один из способов:

def func(x):
    names = x.query('tag == 1').sort_values('amount', ascending=False)['name']
    return names.iloc[0] if not names.empty else np.nan

df['highest_name'] = df['cluster'].map(df.groupby('cluster').apply(func))
...