为每个唯一值查找多列的众数

我有一个包含 ID 列和 10 个不同常规服务列和 1 个高级服务列的数据集。一个人可以多次进入,因此 ID 可以重复。在一个人的访问期间,他们还可以购买最多 10 项常规服务,外加 1 项高级服务。


我希望能够确定每个独特的人购买最多的常规服务,以及他们购买最多的优质服务。如果任何服务的模式对于普通或高级服务都相同,则任何服务都可以。


使用熊猫,我的数据框如下所示:


ID    Service1    Service2    Service3 .... Service10    Premium

----------------------------------------------------------------

1     A           B           C             Z            XX

1     B           C           D             Y            XY

1     A           B           C             O            XX

2     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    PremiumSvcMode

1     B             XX

2     R             XX

如果可能的话,我更喜欢使用纯熊猫——任何建议将不胜感激。


函数式编程
浏览 131回答 1
1回答

浮云间

我不确定您的原始代码有什么问题,但这是一种解决方案:import pandas as pdfrom itertools import chain>>>df   Service1 Service2 Service3 Service10ID1         A        B        C         Z1         B        C        D         Y1         A        B        C         O2         R        S        T         Bdf_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_regsvcID1    B2    Rdtype: object# Join it with the aggregate for the Premium columndf_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 PremiumID1   B         XX2   R         XX
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python