小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

查找每個機頂盒的偏好頻道

 CDA數據分析師 2023-05-15 發(fā)布于北京


  CDA數據分析師 

import numpy as np
import pandas as pd

下列數據描述的是每個機頂盒觀看各個電視頻道的時長,通過這組原始數據,查找出每個機頂盒偏好的頻道并進行排序,原始數據如下:

data

目標數據如下:偏好頻道1到偏好頻道4的排序依據是觀看時長降序排列,也就是當前機頂盒觀看偏好頻道1的時長最長,觀看偏好頻道4的時長最短,如何才能在原始數據的基礎上得到下列數據呢?

思路:實際上,上述兩個圖表之間的關系可以看成每個機頂盒設備號是一組,然后組內按照時長進行降序排序,排序后,時長列舍棄不要,把頻道名稱列轉換成行即可,按照這個思路,我們一步一步實現。

第一步:按照機頂盒設備號分組,組內按照時長降序排序,這兩步可以用一行代碼實現,具體如下:

data.groupby(["機頂盒設備號"]).apply(lambda x :x.sort_values("時長",ascending=False))

</style>



機頂盒設備號頻道名稱時長
機頂盒設備號



10001010001東方衛(wèi)視1.764052
110001翡翠臺0.400157
10002310002江蘇衛(wèi)視2.240893
410002珠江電影1.867558
210002浙江衛(wèi)視0.978738
510002卡酷動畫0.977278
10003610003湖南衛(wèi)視0.950088
910003廣東衛(wèi)視0.410599
710003中央5臺0.151357
810003北京衛(wèi)視0.103219
100041110004江西衛(wèi)視1.454274
1010004福建衛(wèi)視0.144044
100051210005河北衛(wèi)視0.761038
1410005陜西衛(wèi)視0.443863
1310005河南衛(wèi)視0.121675

</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表示是否忽略原索引,忽略原索引即對組內索引進行重置,所以只需要添加這一個參數就可以了,具體代碼及效果如下:

dff = data.groupby(["機頂盒設備號"]).apply(lambda x :x.sort_values("時長",ascending=False,ignore_index=True))
dff

第二步:到這一步,已經基本時實現了查找每個機頂盒的偏好頻道,但是,這種形式看起來不太直觀。

對于我們的目標來說,時長只在排序的時候有作用,所以,在這個表中,有用的只是索引列和頻道名稱,我們只需要把頻道名稱從列轉換成行即可。這個轉換用到的是unstack方法,即把列轉換成行。

在轉換的時候,不要整個數據集轉換,有用的數據提取出來進行轉換即可,有用的數據就是索引列和頻道名稱,提取出來的數據如下:

dff["頻道名稱"]
機頂盒設備號  
10001   0    東方衛(wèi)視
        1     翡翠臺
10002   0    江蘇衛(wèi)視
        1    珠江電影
        2    浙江衛(wèi)視
        3    卡酷動畫
10003   0    湖南衛(wèi)視
        1    廣東衛(wèi)視
        2    中央5臺
        3    北京衛(wèi)視
10004   0    江西衛(wèi)視
        1    福建衛(wèi)視
10005   0    河北衛(wèi)視
        1    陜西衛(wèi)視
        2    河南衛(wèi)視
Name: 頻道名稱, dtype: object

其中機頂盒設備號和rangeindex組成的多重索引,數據只有頻道名稱,運用unstack把頻道名稱轉換成行數據,代碼如下:

dff1 = dff["頻道名稱"].unstack()
dff1

</style>


0123
機頂盒設備號



10001東方衛(wèi)視翡翠臺NaNNaN
10002江蘇衛(wèi)視珠江電影浙江衛(wèi)視卡酷動畫
10003湖南衛(wèi)視廣東衛(wèi)視中央5臺北京衛(wèi)視
10004江西衛(wèi)視福建衛(wèi)視NaNNaN
10005河北衛(wèi)視陜西衛(wèi)視河南衛(wèi)視NaN

</div>

第三步:現在只需要按照要求修改列名即可,代碼如下:

dff1.columns=["偏好頻道1","偏好頻道2","偏好頻道3","偏好頻道4"]
dff1

</style>


偏好頻道1偏好頻道2偏好頻道3偏好頻道4
機頂盒設備號



10001東方衛(wèi)視翡翠臺NaNNaN
10002江蘇衛(wèi)視珠江電影浙江衛(wèi)視卡酷動畫
10003湖南衛(wèi)視廣東衛(wèi)視中央5臺北京衛(wèi)視
10004江西衛(wèi)視福建衛(wèi)視NaNNaN
10005河北衛(wèi)視陜西衛(wèi)視河南衛(wèi)視NaN

</div>

這樣就能直觀的看出,每一個機頂盒的偏好頻道了。

    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多