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,仔細研究一下之后發現必須對齊索引,所以加入了這一句作為保障。

 

以上~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM