zoukankan      html  css  js  c++  java
  • pandas技巧两则——列内元素统计和列内元素排序

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

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

    数据处理的话一般pandas是用到最多的啦,这次我遇到了这样的问题,比如我有个DataFrame如下:

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

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

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

    是不是有点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不唯一),只要再加上

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

    就好了。

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

    def a_rank(x):
        b=x.reset_index() #把索引变成1、2、3、4、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,仔细研究一下之后发现必须对齐索引,所以加入了这一句作为保障。

    以上~

  • 相关阅读:
    笔记35 跨重定向请求传递数
    判断邮箱的正则表达式
    按钮
    async await 的用法
    笔记34 Spring MVC的高级技术——处理multipart形式的数据
    Convert Sorted Array to Binary Search Tree
    Binary Tree Zigzag Level Order Traversal
    Unique Binary Search Trees,Unique Binary Search Trees II
    Validate Binary Search Tree
    Populating Next Right Pointers in Each Node,Populating Next Right Pointers in Each Node II
  • 原文地址:https://www.cnblogs.com/silence-gtx/p/8546586.html
Copyright © 2011-2022 走看看