pandas技巧两则——列内元素统计和列内元素排序

更新:后来突然发现有个cumcount()函数,支持正排倒排,因此如下说的那些基本都没啥用了。app

 

最近作比赛线上无甚进展,因此先小小地总结遇到的一些困难和解决的方法,以防以后忘记。毕竟老是忙着大步赶路的话,容易扯着蛋。在此感谢群内大佬们的指导,给了我思路和解决方案。函数

数据处理的话通常pandas是用到最多的啦,此次我遇到了这样的问题,好比我有个DataFrame以下:ui

首先我想统计一下A、B、C分别出现了几回,而且做为一列写在旁边,但我又不想groupby再count再merge什么的,有没有什么简单的方法?spa

有的,np.unique,咱们先来看看这个函数是什么效果:code

诶哟,不就是个查看惟一性的函数吗……,但这个函数有个参数return_counts:blog

是否是有点Counter的意思了?排序

咱们把这两列zip一下,再转成字典不就是解决方法了吗?索引

def a_count(df):
    count_dic=dict(zip(*np.unique(df['什么玩意儿'],return_counts=True)))
    return df['什么玩意儿'].apply(lambda x:count_dic[x])

能够看到每一个A边上都写了A出现了3次,B、C亦如是,第一个目标完成了~事件

进一步说,若是你想知道列内某个元素是否惟一的话(B惟一,A、C不惟一),只要再加上ip

df[df['计数']>1]=0

就行了。

 

接下来,我想实现的是A第一次出现时边上显示1,第二次显示2,以此类推。这里我就直接写函数了:

def a_rank(x):
    b=x.reset_index() #把索引变成一、二、三、四、5……这样
    b['index']=b.index #加出一列记录索引
    b=b.groupby(['什么玩意儿'])['index'].rank() #按照“什么玩意儿”分组以后获得记录索引列的排序
    b.index=x.index  #多加了一步,变回原来的索引
    return b.astype(np.uint8) #原返回值为float64

结果如图:

这种能够用于分别记录若干个用户第几回访问的事件,若是我要记录倒数第几回访问的话也很简单,把函数第3句改动一下就行了:

b=b.groupby(['什么玩意儿'])['index'].rank(ascending=False) #默认ascending=True,即升序,改成False即为降序

另外说一下为何要多加一句

b.index=x.index

这是因为实际应用中个人df是从一个更大的DataFrame中抽样出来的,其索引并不连续,在没加这句以前,我发现排序的结果中出现了不少nan,仔细研究一下以后发现必须对齐索引,因此加入了这一句做为保障。

 

以上~

相关文章
相关标签/搜索