更新:後來突然發現有個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,仔細研究一下以後發現必須對齊索引,因此加入了這一句做爲保障。
以上~