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

时间:2019-03-29 02:55:15

标签: python python-3.x pandas

我有一个数据集,其中包含一个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

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

1 个答案:

答案 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)
       }
   }
}