为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕无忌1623718 2021-08-24 18:13:20
我有以下pandas数据框df:cluster   tag   amount   name1         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_amount1         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_amount1         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 添加条件,并在每一行上重复该解决方案吗?
查看完整描述

1 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

您可以将其作为一个两阶段过程来执行。先计算一个映射系列,然后按簇映射:


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


查看完整回答
反对 回复 2021-08-24
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信