1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python實(shí)現(xiàn) ! 千萬級(jí)別數(shù)據(jù)處理

        共 3600字,需瀏覽 8分鐘

         ·

        2020-12-07 22:32

        今天分享一個(gè)數(shù)據(jù)清洗小技巧,可以讓你在遇到 百萬、千萬級(jí)別數(shù)據(jù) 的時(shí)候游刃有余。

        先來說說問題的背景

        現(xiàn)在有一個(gè) csv 格式的數(shù)據(jù)集,大概 2千萬條 左右的樣子,存儲(chǔ)的是用戶的網(wǎng)絡(luò)交互數(shù)據(jù),其中電話號(hào)碼作為用戶的唯一標(biāo)識(shí)。

        再來看看我們要做啥

        首先我們需要針對(duì)這批用戶確定所屬運(yùn)營(yíng)商,其次根據(jù)交互數(shù)據(jù)對(duì)各運(yùn)營(yíng)商的用戶感知情況進(jìn)行分析,最后給出各運(yùn)營(yíng)商的相應(yīng)優(yōu)化解決措施。

        這個(gè)目標(biāo)的第一部分:確定用戶歸屬運(yùn)營(yíng)商,正好可以用今天這個(gè)小技巧去解決。


        判斷兩千萬個(gè)號(hào)碼中每個(gè)號(hào)碼歸屬的運(yùn)營(yíng)商,你應(yīng)該首先會(huì)想到循環(huán)遍歷。

        但是你如果真的挨個(gè)號(hào)碼去遍歷一次,你會(huì)發(fā)現(xiàn)讀一遍數(shù)據(jù)都需要好久,甚至可能會(huì)需要幾分鐘、十幾分鐘。

        所以今天會(huì)用到 Pandas 中的矢量化操作,通過 isin 函數(shù)進(jìn)行篩選過濾,完成上面這個(gè)任務(wù) 只需要一兩秒


        矢量化操作

        矢量化,有別于對(duì)每一個(gè)單獨(dú)的值(標(biāo)量)進(jìn)行操作,是 Pandas 底層支持的對(duì)于整個(gè) Array 進(jìn)行的操作,也是Pandas 中執(zhí)行的最快的方法。

        這種操作適用于對(duì)某一列的全體數(shù)據(jù)進(jìn)行普適的操作,即矢量化是對(duì)整個(gè)數(shù)組執(zhí)行操作的過程。

        矢量化操作適用于 Pandas 的 Dataframe,Series 對(duì)象


        Pandas 對(duì)于常用的函數(shù),例如求和、平均值等常用統(tǒng)計(jì)函數(shù)做了非常好的矢量化支持。

        在大多數(shù)場(chǎng)景下,我們需要做的只是 把一整列的元素,當(dāng)成一個(gè)元素去處理,Pandas 會(huì)自動(dòng)把函數(shù)應(yīng)用到每一個(gè)單元格上。例如

        df_data['age']?=?df_data['age']?+?5

        這就是最簡(jiǎn)單的矢量化操作,就算你的數(shù)據(jù)集是 2 千萬條,執(zhí)行一次簡(jiǎn)單矢量化操作最多幾秒也就可以搞定。

        isin 方法可以通過矢量化操作,完成簡(jiǎn)單的數(shù)據(jù)篩選


        isin函數(shù)

        常用的是 DataFrame 的 isin 函數(shù),它的官方定義是這樣的:

        def?isin(self,?values):
        ????"""
        ????Whether?each?element?in?the?DataFrame?is?contained?in?values.

        ?Parameters
        ????----------
        ????values?:?iterable,?Series,?DataFrame?or?dict
        ????The?result?will?only?be?true?at?a?location?if?all?the
        ????labels?match.?If?`values`?is?a?Series,?that's?the?index.?If
        ????`values`?is?a?dict,?the?keys?must?be?the?column?names,
        ????which?must?match.?If?`values`?is?a?DataFrame,
        ????then?both?the?index?and?column?labels?must?match.

        ?Returns
        ????-------
        ????DataFrame
        ????DataFrame?of?booleans?showing?whether?each?element?in?the?DataFrame
        ????is?contained?in?values.
        ????"""

        可以看到需要傳入一個(gè)參數(shù) values,函數(shù)會(huì)返回一個(gè) DataFrame。

        其中參數(shù) values 大致解釋如下:

        values :iterable, Series, DataFrame 或 dict

        • 如果所有標(biāo)簽都匹配,則結(jié)果僅在某個(gè)位置為 true。
        • 如果 values 是 Series,那就是索引。
        • 如果 values 是一個(gè) dict,則鍵必須是必須匹配的列名。
        • 如果值是 DataFrame,則索引標(biāo)簽和列標(biāo)簽都必須匹配。

        返回值是一個(gè)布爾的 DataFrame,顯示 DataFrame 中的每個(gè)元素是否包含在值 values 中。


        大致解釋一下:

        • 當(dāng) values 是列表時(shí),將會(huì)檢查列表中是否存在 DataFrame 中的每個(gè)值

        • 當(dāng) values 是 dict 時(shí),可以通過傳遞值以分別檢查每一列

        • 當(dāng) values 是 Series 或 DataFrame 時(shí),索引和列必須匹配

        """創(chuàng)建?DataFrame"""
        df?=?pd.DataFrame({'num_legs':?[2,?4],?'num_wings':?[2,?0]},?index=['falcon',?'dog'])
        df
        ???????????num_legs??num_wings
        falcon?????????2??????????2
        dog????????????4??????????0

        #?values?是列表
        df.isin([0,?2])
        ??????????num_legs??num_wings
        falcon??????True???????True
        dog????????False???????True

        #?values?是?dict
        df.isin({'num_wings':?[0,?3]})
        ??????????num_legs??num_wings
        falcon?????False??????False
        dog????????False???????True

        #?values?是?DataFrame
        other?=?pd.DataFrame({'num_legs':?[8,?2],?'num_wings':?[0,?2]},?index=['spider','falcon'])
        df.isin(other)
        ??????????num_legs??num_wings
        falcon??????True???????True
        dog????????False??????False

        isin 函數(shù)的用法就這些,很簡(jiǎn)單,下面針對(duì)我們遇到的問題試試用 isin 快速解決


        isin 實(shí)戰(zhàn)

        首先在判斷號(hào)碼歸屬運(yùn)營(yíng)商時(shí)需要借助一個(gè)表

        對(duì)!各運(yùn)營(yíng)商對(duì)應(yīng)的號(hào)段表

        這個(gè)號(hào)段在網(wǎng)上應(yīng)該都能查到,另外,需要注意還有一些運(yùn)營(yíng)商對(duì)應(yīng)的虛擬號(hào)段

        各運(yùn)營(yíng)商號(hào)段】

        根據(jù)號(hào)段去確定每個(gè)用戶號(hào)碼的運(yùn)營(yíng)商歸屬即可

        具體實(shí)現(xiàn)代碼如下:

        #?獲取移動(dòng)運(yùn)營(yíng)商的號(hào)段
        mobile_list?=?df_data.loc[df_data['運(yùn)營(yíng)商']?==?'移動(dòng)',?'號(hào)段'].drop_duplicates().tolist()
        #?根據(jù)移動(dòng)號(hào)段匹配所有移動(dòng)用戶
        df_data_mobile?=?df_data.loc[df_data['號(hào)段'].str.slice(0,?3).isin(mobile_list),?:]

        #?獲取聯(lián)通運(yùn)營(yíng)商的號(hào)段
        unicom_list?=?df_data.loc[df_data['運(yùn)營(yíng)商']?==?'聯(lián)通',?'號(hào)段'].drop_duplicates().tolist()
        #?根據(jù)聯(lián)通號(hào)段匹配所有聯(lián)通用戶
        df_data_unicom?=?df_data.loc[df_data['號(hào)段'].str.slice(0,?3).isin(unicom_list),?:]

        #?匹配電信用戶
        df_data_net?=?df_data.loc[~df_data['號(hào)段'].str.slice(0,?3).isin(mobile_list)?&
        ??????????????????????????~df_data['號(hào)段'].str.slice(0,?3).isin(unicom_list)
        ??????????????????????????,?:]

        【左右滑動(dòng)查看更多】

        代碼中通過 isin 方法和 loc 結(jié)合,實(shí)現(xiàn)了對(duì) DataFrame 的過濾篩選。

        稍微解釋一下:首先根據(jù)移動(dòng)號(hào)段確定移動(dòng)用戶,其次根據(jù)聯(lián)通號(hào)段確定聯(lián)通用戶,最后通過 isin 的反方法確定非移動(dòng)和聯(lián)通的號(hào)段,即電信號(hào)段,確定電信用戶。

        需要注意,isin 方法的反方法是在其前面加上 ~,不存在 isnotin 方法,


        寫在后面的話

        巧用 isin 方法,可以極大的提高數(shù)據(jù)處理效率,還能提高打工人的代碼素養(yǎng)。

        另外,類似的方法還有 where、cut 等,都可直接進(jìn)行矢量化操作,下次遇到具體案例了再分享。

        ·················END·················

        推薦閱讀

        1. 說說心里話

        2. 寫給所有數(shù)據(jù)人。

        3. 從留存率業(yè)務(wù)案例談0-1的數(shù)據(jù)指標(biāo)體系

        4. NB,真PDF神處理工具!

        5. 超級(jí)菜鳥如何入門數(shù)據(jù)分析?


        歡迎長(zhǎng)按掃碼關(guān)注「數(shù)據(jù)管道」

        瀏覽 188
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            成人超碰在线观看 | 国产剧情一区 | a√在线视频 | 自拍视频第一页 | 免费在线观看a级片 | 双乳奶水饱满少妇呻吟一好爽毛片_区 | 喝尿坐脸上h辣文 | 色tv国产| 国产精品爽爽爽 | 国产成人盗摄精品A片在线观看 |