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

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

為每個唯一值查找多列的眾數

為每個唯一值查找多列的眾數

函數式編程 2021-12-21 16:00:22
我有一個包含 ID 列和 10 個不同常規服務列和 1 個高級服務列的數據集。一個人可以多次進入,因此 ID 可以重復。在一個人的訪問期間,他們還可以購買最多 10 項常規服務,外加 1 項高級服務。我希望能夠確定每個獨特的人購買最多的常規服務,以及他們購買最多的優質服務。如果任何服務的模式對于普通或高級服務都相同,則任何服務都可以。使用熊貓,我的數據框如下所示:ID    Service1    Service2    Service3 .... Service10    Premium----------------------------------------------------------------1     A           B           C             Z            XX1     B           C           D             Y            XY1     A           B           C             O            XX2     R           S           T             B            XX我試過 df.mode() 和 pd.Series.mode() 但我不斷收到錯誤。我正在嘗試生成唯一客戶端列表(按 ID)以及所有列的模式。我還需要一種單列模式。這是針對常規服務的(需要找到超過 10 列的模式):def servicemode(group):    svcs_cols = [group['Service1'],               group['Service2'],               group['Service3'],               group['Service4'],               group['Service5'],               group['Service6'],               group['Service7'],               group['Service8'],               group['Service9'],               group['Service10']]    return pd.concat(dx_cols).dropna(inplace=False).agg(lambda x: pd.Series.mode(x)[0])df.groupby('ID').apply(servicemode)這是用于高級服務(需要在單列中找到模式):df.groupby('ID')['Premium'].agg(lambda x: pd.Series.mode(x)[0])這是想要的結果:ID    RegSvcMode    PremiumSvcMode1     B             XX2     R             XX如果可能的話,我更喜歡使用純熊貓——任何建議將不勝感激。
查看完整描述

1 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

我不確定您的原始代碼有什么問題,但這是一種解決方案:


import pandas as pd

from itertools import chain


>>>df

   Service1 Service2 Service3 Service10

ID

1         A        B        C         Z

1         B        C        D         Y

1         A        B        C         O

2         R        S        T         B


df_regsvc = df.groupby(df.index)['Service1','Service2','Service3','Service10'] \

    .apply(lambda x : list(chain.from_iterable([*x.values]))) \

    .apply(lambda x: max(x, key=x.count)).to_frame()


>>>df_regsvc

ID

1    B

2    R

dtype: object


# Join it with the aggregate for the Premium column

df_premium = df.groupby(df.index)['Premium'].agg(lambda x: pd.Series.mode(x)[0]).to_frame()

df_agg = df_regsvc.join(df_premium)


>>>df_agg

    0 Premium

ID

1   B         XX

2   R         XX


查看完整回答
反對 回復 2021-12-21
  • 1 回答
  • 0 關注
  • 154 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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