• 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,仔细研究一下之后发现必须对齐索引,所以加入了这一句作为保障。

    以上~

  • 相关阅读:
    【转】比较全面的讲解 APS.NET MVC
    WebCast中的WCF视频教程
    【转】Linq Lambda学习
    RSA算法和习题分析。
    图片处理渐变
    Sql Server 和 Access 操作数据库结构Sql语句
    MSDN目录结构摘要
    C#开发一个如上的工业仪表盘控件
    NET Reflector 是反编译.NET 源码
    asp.net实现Bar图
  • 原文地址:https://www.cnblogs.com/silence-gtx/p/8546586.html
Copyright © 2020-2023  润新知