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基礎(chǔ)】Pandas向量化字符串操作

        共 7758字,需瀏覽 16分鐘

         ·

        2020-11-21 05:19

        一、向量化操作概述

        Python內(nèi)置一系列強(qiáng)大的字符串處理方法,但這些方法只能處理單個(gè)字符串,處理一個(gè)序列的字符串時(shí),需要用到循環(huán)。

        那么,有沒有辦法,不用循環(huán)就能同時(shí)處理多個(gè)字符串呢,pandas的向量化操作就提供了這樣的方法。

        向量化的操作使我們不必?fù)?dān)心數(shù)組的長(zhǎng)度和維度,只需要關(guān)系操作功能,尤為強(qiáng)大的是,除了支持常用的字符串操作方法,還集成了正則表達(dá)式的大部分功能,這使得pandas在處理字符串列時(shí),具有非常大的魔力。

        例如,要計(jì)算每個(gè)單詞中‘a(chǎn)’的個(gè)數(shù),下面一行代碼就可以搞定,非常高效

        s = pd.Series(['amazon','alibaba','baidu'])s.str.count('a')0    21    32    1

        假如用內(nèi)置的字符串函數(shù)進(jìn)行操作,需要進(jìn)行遍歷,且Python原生的遍歷操作無(wú)法處理缺失值。

        #用循環(huán)進(jìn)行處理
        s = ['amazon','alibaba','baidu'][i.count('a') for i in s][2,?3,?1]

        #存在缺失值時(shí),打印報(bào)錯(cuò)
        s = ['amazon','alibaba','baidu',None][i.count('a') for i in s]AttributeError: 'NoneType' object has no attribute 'lower'

        Pandas的向量化操作,能夠正確的處理缺失值,無(wú)報(bào)錯(cuò)信息,如下

        s = pd.Series(['amazon','alibaba','baidu',None])s.str.count('a')Out[36]: 0    2.01    3.02    1.03    NaNdtype: float64

        通過(guò)上面的例子,對(duì)向量化進(jìn)行簡(jiǎn)單總結(jié),向量化是一種同時(shí)操作整個(gè)數(shù)組而不是一次操作一個(gè)元素的方法,下面從看看具體怎么應(yīng)用。

        ?


        二、向量化的字符方法

        Pandas的字符串屬的方法幾乎包括了大部分Python的內(nèi)置字符串方法(內(nèi)置共有45個(gè)方法),下面將列舉一些常見的方法的用法,例如上面的count()方法將會(huì)返回某個(gè)字符的個(gè)數(shù),而len方法將會(huì)返回整個(gè)字符的長(zhǎng)度。

        方法

        說(shuō)明

        len()

        計(jì)算字符串長(zhǎng)度

        strip()

        等價(jià)于str.strip,去除字符串開頭和結(jié)尾處指定的字符

        rstrip()

        等價(jià)于str.rstrip ,刪除字符串末尾的指定字符(默認(rèn)為空格)

        lstrip()

        等價(jià)于str.lstrip,截掉字符串左邊的空格或指定字符

        partition()

        等價(jià)于str.partition,根據(jù)指定的分隔符(sep)將字符串進(jìn)行分割,從左邊開始

        rpartition()

        等價(jià)于str.rpartition,根據(jù)指定的分隔符(sep)將字符串進(jìn)行分割,從右邊開始

        lower()

        等價(jià)于str.lower,所有大寫字母轉(zhuǎn)換為小寫字母,僅限英文

        casefold()

        等價(jià)于str.casefold,所有大寫字母轉(zhuǎn)換為小寫字母,包括非英文

        upper()

        等價(jià)于str.upper,小寫字母轉(zhuǎn)換為大寫字母

        find()

        等價(jià)于str.find,查找字符串中指定的子字符串sub第一次出現(xiàn)的位置

        rfind()

        等價(jià)于str.rfind,查找字符串中指定的子字符串sub最后一次出現(xiàn)的位置

        index()

        等價(jià)于str.index,查找字符串中第一次出現(xiàn)的子字符串的位置

        rindex()

        等價(jià)于str.rindex,返回子字符串最后一次出現(xiàn)在字符串中的索引位置

        capitalize()

        等價(jià)于str.capitalize,將字符串的第一個(gè)字母變成大寫,其余字母變?yōu)樾?/span>

        swapcase()

        等價(jià)于str.swapcase,將字符串str中的大小寫字母同時(shí)進(jìn)行互換

        normalize()

        返回Unicode 標(biāo)注格式。等價(jià)于 unicodedata.normalize

        translate()

        等價(jià)于str.translate,根據(jù)maketrans()函數(shù)給出的字符映射表來(lái)轉(zhuǎn)換字符

        isalnum()

        等價(jià)于str.isalnum,檢測(cè)字符串是否由字母和數(shù)字組成

        isalpha()

        等價(jià)于str.isalpha,檢測(cè)字符串是否只由字母組成

        isdigit()

        等價(jià)于str.isdigit,檢測(cè)字符串是否只由數(shù)字組成

        isspace()

        等價(jià)于str.isspace,檢測(cè)字符串是否只由空格組成

        islower()

        等價(jià)于str.islower,檢測(cè)字符串中的字母是否全由小寫字母組成

        isupper()

        等價(jià)于str.isupper,檢測(cè)字符串中的字母是否全由大寫字母組成

        istitle()

        等價(jià)于str.istitle,檢測(cè)所有單詞首字母是否為大寫,且其它字母是否為小寫

        isnumeric()

        等價(jià)于str.isnumeric,測(cè)字符串是否只由數(shù)字組成

        isdecimal()

        等價(jià)于str.isdecimal,檢查字符串是否只包含十進(jìn)制字符

        startswith()

        等價(jià)于str.startswith(pat),判斷字符串是否以指定字符或子字符串開頭

        endswith()

        等價(jià)于str.endswith(pat),判斷字符串是否以指定字符或子字符串結(jié)尾

        center()

        等價(jià)于str.center,即字符串str居中,兩邊用字符填充

        ljust()

        等價(jià)于str.ljust,左對(duì)齊填充,并使用fillchar填充(默認(rèn)為空格)

        rjust()

        等價(jià)于str.rjust,右對(duì)齊填充,默認(rèn)為空格

        zfill()

        等價(jià)于str.zfill,右對(duì)齊,前面用0填充到指定字符串長(zhǎng)度

        下面選取部分函數(shù)舉例,其他函數(shù)參考字符串模塊:Python字符串的45個(gè)方法詳解

        len()

        import pandas as pdimport numpy as np  s = pd.Series(['amazon','alibaba','Baidu'])s.str.len()Out[5]: 0    61    72    5dtype: int64

        lower()

        s = pd.Series(['amazon','alibaba','Baidu'])s.str.lower()0     amazon1    alibaba2      baidu


        zfill()

        右對(duì)齊,前面用0填充到指定字符串長(zhǎng)度

        s = pd.Series(['56783','34','987766721','326'])s.str.zfill(10) Out[53]: 0    00000567831    00000000342    09877667213    0000000326dtype: object

        ?

        三、向量化的正則表達(dá)式

        Pandas的字符串方法根據(jù)Python標(biāo)準(zhǔn)庫(kù)的re模塊實(shí)現(xiàn)了正則表達(dá)式,下面將介紹Pandas的str屬性內(nèi)置的正則表達(dá)式相關(guān)方法

        方法

        說(shuō)明

        match()

        對(duì)每個(gè)元素調(diào)用re.match(),將會(huì)返回一個(gè)布爾數(shù)組

        extract()

        對(duì)每個(gè)元素調(diào)用re.match(),將會(huì)返回所有結(jié)果構(gòu)成的字符串?dāng)?shù)組

        findall()

        對(duì)每個(gè)元素用re.findall()

        replace()

        用正則模式替換字符串

        contains()

        對(duì)每個(gè)元素調(diào)用re.search()返回布爾類型

        count()

        計(jì)算符合正則表達(dá)式的字符串?dāng)?shù)量

        split()

        等價(jià)于str.spilt(),支持正則表達(dá)式

        rsplit()

        等價(jià)于str.rsplit()支持正則表達(dá)式


        split()

        split,按指定字符分割字符串,類似split的方法返回一個(gè)列表類型的序列

        #按數(shù)字分割
        pd.Series(['QQ1252號(hào)碼','QQ1353加我','我389的']).str.split('\d+')Out[39]: 0    [QQ, 號(hào)碼]1    [QQ, 加我]2     [我, 的]dtype: object

        s=pd.Series(['a_b_c', 'c_d_e', np.nan, 'f_g_h'])s.str.split('_')Out[94]: 0 [a, b, c]1 [c, d, e]2 NaN3 [f, g, h]dtype: object

        切分后的列表中的元素可以通過(guò)get方法或者?[]?方法進(jìn)行讀取

        s.str.split('_').str.get(1)Out[96]: 0      b1      d2    NaN3      gdtype: object

        使用expand方法可以輕易地將這種返回展開為一個(gè)數(shù)據(jù)表

        s.str.split('_', expand=True)Out[97]:      0    1    20    a    b    c1    c    d    e2  NaN  NaN  NaN3    f    g    h

        同樣,我們也可以限制切分的次數(shù):

        In [20]: s.str.split('_', expand=True, n=1)Out[20]:      0    10    a  b_c1    c  d_e2  NaN  NaN3    f  g_h

        rsplit()

        rsplit與split相似,不同的是,這個(gè)切分的方向是反的。即,從字串的尾端向首段切分

        In [21]: s.str.rsplit('_', expand=True, n=1)Out[21]:      0    10  a_b    c1  c_d    e2  NaN  NaN3  f_g    h

        replace ()

        replace方法默認(rèn)使用正則表達(dá)式

        s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca','', np.nan, 'CABA', 'dog', 'cat'])

        s.str.replace('^.a|dog', 'XX-XX ', case=False)Out[27]: 0 A1 B2 C3 XX-XX ba4 XX-XX ca5 6 NaN7 XX-XX BA8 XX-XX 9 XX-XX t

        findall()

        提取聊天記錄中的QQ號(hào)
        s=pd.Series(['QQ號(hào)碼123452124','QQ123356123','我的Q123356189','Q號(hào)123356111注意','加我Q號(hào)123356124有驚喜'])s.str.findall('\d+')0    [123452124]1    [123356123]2    [123356189]3    [123356111]4    [123356124]

        ?

        四、其他向量化的方法

        除了上面介紹的Pandas字符串的正常操作和正則表達(dá)式外,Pandas的str屬性還提供了其他的一些方法,這些方法非常的有用,在進(jìn)行特征提取或者數(shù)據(jù)清洗時(shí),非常高效,具體如下:

        方法

        說(shuō)明

        get()

        獲取元素索引位置上的值,索引從0開始

        slice()

        對(duì)元素進(jìn)行切片取值

        slice_replace()

        對(duì)元素進(jìn)行切片替換

        cat()

        連接字符串

        repeat()

        重復(fù)元素

        normalize()

        將字符串轉(zhuǎn)換為Unicode規(guī)范形式

        pad()

        在字符串的左邊右邊或者兩邊增加空格

        wrap()

        將字符串按照指定的寬度換行

        join()

        用分隔符連接Series對(duì)象的每個(gè)元素

        get_dummies()

        按照分隔符提取每個(gè)元素的dummy變量,轉(zhuǎn)換為one-hot編碼的DataFrame

        wrap()

        s = pd.Series(['0000056783','0000000034','0987766721'])s.str.wrap(5)Out[68]: 0    00000\n567831    00000\n000342    09877\n66721dtype: object

        pad()

        s = pd.Series(['A','E','C','D','E'])s.str.pad(5)Out[65]: 0        A1        E2        C3        D4        Edtype: object

        slice()

        Series_1 = pd.Series(['馬 云:2000億','馬化騰:1800億','王健林:1200億','小伍哥:0.000012億'])Series_1.str.slice(0,3)Out[33]: 0    馬 云1    馬化騰2    王健林3    小伍哥dtype: object

        get()

        Series_1.str.get(0)Out[34]: 0    1    2    3    dtype: object

        slice_replace()

        切片替換
        Series_1.str.slice_replace(0,3,'小伍哥')Out[36]: 0        小伍哥:2000億1        小伍哥:1800億2        小伍哥:1200億3    小伍哥:0.000012億dtype: object

        Series_1.str.join('-')Out[41]: 0 馬- -云-:-2-0-0-0-億1 馬-化-騰-:-1-8-0-0-億2 王-健-林-:-1-2-0-0-億3 小-伍-哥-:-0-.-0-0-0-0-1-2-億dtype: object
        Series_1 = pd.Series(['A','E','C','D','E'])Series_1.str.get_dummies() A C D E0 1 0 0 01 0 0 0 12 0 1 0 03 0 0 1 04 0 0 0

        get_dummies()

        另一個(gè)需要好好解釋的是get_dummies()方法,舉個(gè)例子:假如我們用A,B,C,D來(lái)表示一個(gè)人的某個(gè)特征:

        monte = pd.Series(['Graham Chapman', 'John Cleese', 'Terry Gilliam',                   'Eric Idle', 'Terry Jones', 'Michael Palin'])full_monte = pd.DataFrame({'name': monte,                           'info': ['B|C|D', 'B|D', 'A|C',                                    'B|D', 'B|C', 'B|C|D']})full_monte             name   info0  Graham Chapman  B|C|D1     John Cleese    B|D2   Terry Gilliam    A|C3       Eric Idle    B|D4     Terry Jones    B|C5   Michael Palin  B|C|D可以看到比如Graham Chapman有B,C,D三種特征,而John Cleese有B和D兩種特征。這時(shí)我們可以用get_dummies('|')以|作為分隔符,將這些特征進(jìn)行one-hotfull_monte['info'].str.get_dummies('|')Out[52]:    A  B  C  D0  0  1  1  11  0  1  0  12  1  0  1  03  0  1  0  14  0  1  1  05  0  1  1  1

        repeat()

        s = pd.Series(['A','E','C','D','E'])s.str.repeat(2)Out[62]: 0    AA1    EE2    CC3    DD4    EEdtype:?object

        cat()

        作用:連接字符串?

        用法:Series.str.cat(others=None, sep=None, na_rep=None)?

        參數(shù):?

        • others : 列表或復(fù)合列表,默認(rèn)為None,如果為None則連接本身的元素?

        • sep : 字符串 或者None,默認(rèn)為None?

        • na_rep : 字符串或者 None, 默認(rèn) None。如果為None缺失值將被忽略。?

        返回值:?concat : 序列(Series)/索引(Index)/字符串(str)

        #如果連接的是兩個(gè)序列,則會(huì)一一對(duì)應(yīng)連接s1 = pd.Series(['A','E','C','D','E'])s2 = pd.Series(['1','2','3','4','5'])s1.str.cat(s2)Out[74]: 0    A11    E22    C33    D44    E5dtype: object

        #只提供一個(gè)序列,則只連接自己,默認(rèn)為空格s1.str.cat()'AECDE's1.str.cat(sep='-')'A-E-C-D-E'
        #也可以同時(shí)復(fù)核連接,參數(shù)可以是二維的d = pd.concat([s1, s2], axis=1)s3.str.cat(d, na_rep='-')Out[87]: 0 xA11 xE22 yC33 yD44 yE5dtype: objec


        五、Pandas學(xué)習(xí)文檔

        官方文檔

        鏈接:https://pandas.pydata.org/pandas-docs/stable/index.html

        官方文檔,每個(gè)函數(shù)和方法,都有詳細(xì)的介紹,對(duì)于英語(yǔ)比較好的同學(xué),強(qiáng)烈推薦直接看官方文檔,非常清晰,完整。

        ? ? ? ? ? ? ?


        中文文檔

        文檔鏈接:https://www.pypandas.cn/docs/

        對(duì)于英語(yǔ)不好的同學(xué),可以看國(guó)內(nèi)翻譯過(guò)來(lái)的文檔,還是比較全面的,基本上也能獲得比較好的學(xué)習(xí)效果。

        ? ? ? ?? ? ? ?

        接口文檔

        https://pandas.pydata.org/pandas-docs/version/0.17.0/#

        ?

        往期精彩回顧





        獲取本站知識(shí)星球優(yōu)惠券,復(fù)制鏈接直接打開:

        https://t.zsxq.com/y7uvZF6

        本站qq群704220115。

        加入微信群請(qǐng)掃碼:

        瀏覽 70
        點(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>
            爱涩av | 裸体久久女人亚洲精品 | 超碰国产免费 | 打白嫩光屁股调教拍击, | 麻豆色黄片 | 亚洲第一黄色视频网站 | 顶级毛片成人免费看视频 | ZZijZZij亚洲日本少妇 | 国产区第一页 | 免费无遮挡男女交性视频 |