猿问

如何在拆分中添加条件应用组合并在每行重复解决方案?

我有以下pandas数据框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

有人可以让我知道如何使用 split apply combine 添加条件,并在每一行上重复该解决方案吗?


慕无忌1623718
浏览 124回答 1
1回答

慕少森

您可以将其作为一个两阶段过程来执行。先计算一个映射系列,然后按簇映射: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_name0        1    0     200  Michael          NaN1        2    1    1200     John         John2        2    1     900   Daniel         John3        2    0    3000    David         John4        2    0     600    Jonny         John5        3    0     900  Denisse         Kely6        3    1     900     Mike         Kely7        3    1    3000     Kely         Kely8        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.nandf['highest_name'] = df['cluster'].map(df.groupby('cluster').apply(func))
随时随地看视频慕课网APP

相关分类

Python
我要回答