CDA數據分析師
下列數據描述的是每個機頂盒觀看各個電視頻道的時長,通過這組原始數據,查找出每個機頂盒偏好的頻道并進行排序,原始數據如下:
目標數據如下:偏好頻道1到偏好頻道4的排序依據是觀看時長降序排列,也就是當前機頂盒觀看偏好頻道1的時長最長,觀看偏好頻道4的時長最短,如何才能在原始數據的基礎上得到下列數據呢? 思路:實際上,上述兩個圖表之間的關系可以看成每個機頂盒設備號是一組,然后組內按照時長進行降序排序,排序后,時長列舍棄不要,把頻道名稱列轉換成行即可,按照這個思路,我們一步一步實現。 第一步:按照機頂盒設備號分組,組內按照時長降序排序,這兩步可以用一行代碼實現,具體如下:
</style>
</div> 對上述代碼進行簡單解釋,data.groupby(["機頂盒設備號"])表示對名字為data的數據集進行分組,分組的依據是"機頂盒設備號"這一列,默認把分組依據作為分組數據進行聚合后的行索引(可以通過as_index參數進行設置)。 接下來進行組內排序,對所有小組中的數據進行相同的操作可以通過apply方法實現,apply方法接收的參數是一個函數,目前的需求是組內排序,所以我們傳入apply方法中的函數需要具有排序功能。 分組后的每一個小組都是一個小的dataframe,所以apply中接收的函數,得是能夠為dataframe排序的函數才行。大家最先想到的可能就是dataframe支持的sort_values方法,但是需要注意的是sort_values是dataframe支持的方法,不是通用函數,不能直接作為參數傳遞給apply。 既然是對每個小的dataframe按照時長進行排序,我們可以借助匿名函數,匿名函數中的參數就是每個分組,即分組后的小dataframe,用這個小dataframe調用sort_values方法就可以了,注意填寫上排序的依據--"時長",還有排序的方向ascending=False,降序排序。 以上,得到的結果好像沒有什么問題,的確實現了組內排序,但是,有一個細節(jié)問題,就是索引,從下圖可以看出,索引不是組內索引,我們還需要修改索引,即每一組的索引都是從0到n-1。如果不修改索引,每一組的索引都不一樣的話,沒有辦法得到目標的結果(有興趣的小伙伴可以不修改索引試驗一下)。 其實修改組內索引這一步在剛才的代碼里添加一個參數即可,在對dataframe進行排序的sort_values方法中,有一個參數ignore_index表示是否忽略原索引,忽略原索引即對組內索引進行重置,所以只需要添加這一個參數就可以了,具體代碼及效果如下:
第二步:到這一步,已經基本時實現了查找每個機頂盒的偏好頻道,但是,這種形式看起來不太直觀。 對于我們的目標來說,時長只在排序的時候有作用,所以,在這個表中,有用的只是索引列和頻道名稱,我們只需要把頻道名稱從列轉換成行即可。這個轉換用到的是unstack方法,即把列轉換成行。 在轉換的時候,不要整個數據集轉換,有用的數據提取出來進行轉換即可,有用的數據就是索引列和頻道名稱,提取出來的數據如下:
其中機頂盒設備號和rangeindex組成的多重索引,數據只有頻道名稱,運用unstack把頻道名稱轉換成行數據,代碼如下:
</style>
</div> 第三步:現在只需要按照要求修改列名即可,代碼如下:
</style>
</div> 這樣就能直觀的看出,每一個機頂盒的偏好頻道了。 |
|