我有一个数据集,其中包含一个ID列,10个不同的常规服务列和1个高级服务列。 一个人可能会多次进入,因此ID可以重复。 在一个人的访问期间,他们还可以购买最多10项常规服务,以及一项高级服务。
我希望能够确定每个独特的人购买了最多的常规服务,以及他们也购买了最多的高级服务。如果常规或高级服务的任何服务模式都相同,那么任何服务都可以。
使用大熊猫,我的数据框如下所示:
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
如果可能的话,我更喜欢使用大熊猫-任何建议将不胜感激。谢谢!
答案 0 :(得分:1)
我不确定您的原始代码有什么问题,但这是一种解决方案:
if let cities = document.data()!["cities"] as? [[String:Any]] { // cities is obviously an array of dictionaries
for city in cities { // don't use index based loops if you actually don't need the index
if let cityName = city["cityName"] as? RemoteConfigValue {
print(cityName.stringValue)
}
}
}