如何在数据化框架中按组查找唯一值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在数据化框架中按组查找唯一值相关的知识,希望对你有一定的参考价值。

我创建了一个数据化框架,如下所示。

DT_EX = dt.Frame({'cid':[1,2,1,2,3,2,4,2,4,5],
                  'cust_life_cycle':['Lead','Active','Lead','Active','Inactive','Lead','Active','Lead','Inactive','Lead']})

在这里,我有三个独特的客户生命周期,每个客户的计数都可以发现,作为

DT_EX[:, count(), by(f.cust_life_cycle)]

随着,我有五个客户的ID,这些计数为

DT_EX[:, count(), by(f.cid)]

现在,我想看看每个客户生命周期中存在多少个独特的客户ID。

DT_EX[:, {'unique_cids':dt.unique(f.cid)}, by(f.cust_life_cycle)]

应该显示为Lead客户有3个唯一的客户ID,如(1,2,5),Active用户有2个唯一的客户ID(2,4)等等。

我无法得到预期的效果,请你告诉我如何解决?

顺便说一下:我已经尝试在R data.table框架上重现同样的情况,它的工作。

DT_EX[, uniqueN(cid), by=cust_life_cycle]
答案

dt.unique 函数不适用分组(还没有)。所以,实现你所需要的一种方法是先按生命周期+customerID分组,然后在第二步中只按生命周期重新分组。

>>> DT_EX[:, count(), by(f.cust_life_cycle, f.cid)]
...      [:, {"unique_cids": count()}, by(f.cust_life_cycle)]

   | cust_life_cycle  unique_cids
-- + ---------------  -----------
 0 | Active                     2
 1 | Inactive                   2
 2 | Lead                       3

[3 rows x 2 columns]
另一答案

@pasha

我还为我的实践创建了一个自定义功能,如下图。

def pydt_unique_per_group(DT,by_col,uni_col):
    DT_dict = DT[:,(f[by_col],f[uni_col])].to_dict()
    pairs = list(zip(DT_dict[by_col], DT_dict[uni_col]))
    unique_per_col_dict = {k : list(map(itemgetter(1), v)) for k,v in groupby(sorted(pairs, key=itemgetter(0)), key=itemgetter(0))}
    unique_per_col_count = {drink:len(set(ingr)) for drink,ingr in unique_per_col_dict.items()}
    unique_per_col_count_sort = {k:v for k,v in sorted(unique_per_col_count.items(),key=lambda x:x[1],reverse=True)}
    by_group_summary_dict = {by_col:[],'count':[]}
    for k, v in unique_per_col_count_sort.items():
        by_group_summary_dict[by_col].append(k)
        by_group_summary_dict['count'].append(v)
    return dt.Frame(by_group_summary_dict)

输出。

In [8]: pydt_unique_per_group(DT_EX,'cust_life_cycle','cid')                                                                                                                                                
Out[8]: 
   | cust_life_cycle  count
-- + ---------------  -----
 0 | Lead                 3
 1 | Active               2
 2 | Inactive             2

[3 rows x 2 columns]

以上是关于如何在数据化框架中按组查找唯一值的主要内容,如果未能解决你的问题,请参考以下文章

熊猫中按组的唯一性索引

在R中按组计算日期之间的差异

在具有重复行的 SQL Server 表中按组查找行号

在 Pandas 数据框中按组过滤具有最小值的行 [重复]

在大熊猫DataFrame中按组删除异常值的更快方法[重复]

在数据框中按组折叠文本[重复]