我有一个包含 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
如果可能的话,我更喜欢使用纯熊猫——任何建议将不胜感激。
浮云间
相关分类