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

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

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

函数式编程 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 关注
  • 130 浏览
慕课专栏
更多

添加回答

举报

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