亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在拆分中添加條件應用組合并在每行重復解決方案?

如何在拆分中添加條件應用組合并在每行重復解決方案?

慕無忌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 關注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號