查找每个唯一值的多列模式

2024-05-02 18:28:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集,它有一个ID列、10个不同的常规服务列和1个高级服务列。 一个人可以多次进来,所以身份证可以重复。 在一个人的访问期间,他们还可以购买多达10项常规服务,再加上一项高级服务

我希望能够确定每个人购买最多的常规服务,以及他们购买最多的高级服务。如果任何服务的模式是相同的定期或保费,任何都可以

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

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

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


Tags: 数据lambdaiddfmodeservice模式group
1条回答
网友
1楼 · 发布于 2024-05-02 18:28:58

我不确定您的原始代码有什么问题,但这里有一个解决方案:

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

相关问题 更多 >