Pandas基礎(chǔ)|生成對(duì)應(yīng)編碼的N種方法

      網(wǎng)友投稿 842 2025-04-01

      需求

      已知列表

      [‘50萬(wàn)以上’, ‘10萬(wàn)以下’, ‘10萬(wàn)以下’, ‘50萬(wàn)以上’, ‘10萬(wàn)以下’, ‘10萬(wàn)以下’, ‘30-50萬(wàn)’, ‘10-30萬(wàn)’]

      按照以下關(guān)系生成編碼:

      ‘10萬(wàn)以下’ 1

      ‘10-30萬(wàn)’ 2

      Pandas基礎(chǔ)|生成對(duì)應(yīng)編碼的N種方法

      ‘30-50萬(wàn)’ 3

      ‘50萬(wàn)以上’ 4

      對(duì)于這個(gè)基礎(chǔ)問(wèn)題,使用pandas至少有10種以上的方法去實(shí)現(xiàn)它,你能使用多少個(gè)API去實(shí)現(xiàn),往往能體現(xiàn)你對(duì)Pandas方法的熟練程度,以后任何類似或更復(fù)雜的需求都不怕。下面我將演示較為常規(guī)的幾種供大家復(fù)習(xí)pandas的語(yǔ)法。

      注意:本文已經(jīng)預(yù)設(shè)你掌握了pandas的全部語(yǔ)法,不會(huì)對(duì)基礎(chǔ)詳解。若發(fā)現(xiàn)對(duì)對(duì)某個(gè)API不熟悉,可查詢官方文檔復(fù)習(xí)。

      數(shù)據(jù)構(gòu)造

      import pandas as pd data = ['50萬(wàn)以上', '10萬(wàn)以下', '10萬(wàn)以下', '50萬(wàn)以上', '10萬(wàn)以下', '10萬(wàn)以下', '30-50萬(wàn)', '10-30萬(wàn)'] cats = ['10萬(wàn)以下', '10-30萬(wàn)', '30-50萬(wàn)', '50萬(wàn)以上'] df = pd.DataFrame({"data": data}) df

      解決方法

      方法1:使用pandas自帶的分類數(shù)據(jù)內(nèi)部編碼

      df.data = df.data.astype('category').cat.set_categories(cats) df["code1"] = df.data.cat.codes+1

      為了避免對(duì)后續(xù)代碼的影響,我們將原數(shù)據(jù)還原回字符串類型:

      df.data = df.data.astype('str')

      方法2:使用python字典查詢匹配

      先構(gòu)造一個(gè)查詢字典:

      query_table = dict(zip(cats, range(1, len(cats)+1))) query_table

      {'10萬(wàn)以下': 1, '10-30萬(wàn)': 2, '30-50萬(wàn)': 3, '50萬(wàn)以上': 4}

      然后開(kāi)始循環(huán)查詢:

      df["code2"] = [query_table[x] for x in df.data]

      方法3-4:使用Series的apply方法

      df["code3"] = df.data.apply(lambda x: query_table[x])

      字典內(nèi)部方法可以傳入切片:

      df["code4"] = df.data.apply(query_table.__getitem__)

      方法5:使用Series的map方法傳入函數(shù)

      map方法也可以傳入函數(shù)的:

      df["code5"] = df.data.map(query_table.__getitem__)

      方法6:使用Series的map方法傳入字典

      map方法除了可以傳入函數(shù)外,還支持直接傳入替換字典:

      df["code6"] = df.data.map(query_table)

      方法7:使用Series的replace方法

      replace方法也支持直接傳入替換字典:

      df["code7"] = df.data.replace(query_table)

      replace方法還支持傳入正則表達(dá)式,指定參數(shù)regex=True即可,但是被替換值不能像re模塊一樣可以傳入函數(shù)并被調(diào)用。

      方法8:使用Series的str處理器的replace方法傳入正則替換方法

      這個(gè)方法非常智障,正則替換函數(shù)只能返回字符串,最終還需要還原成數(shù)字類型。

      展示這個(gè)方法只能為了讓大家清楚Series的replace方法與str處理器的replace方法的區(qū)別:

      df["code8"] = df.data.str.replace('.+', lambda m: str(query_table[m.group(0)]), regex=True).astype('int')

      方法9:使用Index的get_indexer方法獲取角標(biāo)位置

      query_index = pd.Index(cats) df["code9"] = query_index.get_indexer(df.data)+1

      方法10:使用Series進(jìn)行批量查詢

      query_series = pd.Series(index=cats, data=range(1, len(cats)+1)) df["code10"] = query_series[df.data].values

      才哥又補(bǔ)充了類似下面的兩種的寫(xiě)法:

      方法11:使用merge表連接

      query_frame = query_series.to_frame() df['code11'] = df[["data"]].merge(query_frame, how='left', left_on='data', right_index=True)[0]

      方法12:使用join表連接

      df['code12'] = df[["data"]].join(query_frame, on='data')[0]

      完整代碼測(cè)試:

      df.data = df.data.astype('category').cat.set_categories(cats) df["code1"] = df.data.cat.codes+1 df.data = df.data.astype('str') query_table = dict(zip(cats, range(1, len(cats)+1))) df["code2"] = [query_table[x] for x in df.data] df["code3"] = df.data.apply(lambda x: query_table[x]) df["code4"] = df.data.apply(query_table.__getitem__) df["code5"] = df.data.map(query_table.__getitem__) df["code6"] = df.data.map(query_table) df["code7"] = df.data.replace(query_table) df["code8"] = df.data.str.replace('.+', lambda m: str(query_table[m.group(0)]), regex=True).astype('int') query_index = pd.Index(cats) df["code9"] = query_index.get_indexer(df.data)+1 query_series = pd.Series(index=cats, data=range(1, len(cats)+1)) df["code10"] = query_series[df.data].values query_frame = query_series.to_frame() df['code11'] = df[["data"]].merge(query_frame, how='left', left_on='data', right_index=True)[0] df['code12'] = df[["data"]].join(query_frame, on='data')[0] df

      可以看到上述所有方法均順利生成了對(duì)應(yīng)的編碼。

      本文展示的方法,僅僅只是拋磚引玉,相信讀者們還可能能想出更多的處理辦法,歡迎留言評(píng)論進(jìn)行交流。

      Python

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel怎樣用函數(shù)求最小值
      下一篇:怎樣打橫線(怎么打橫線)
      相關(guān)文章
      国产亚洲人成网站观看| 国产成人综合亚洲亚洲国产第一页| 亚洲国产成人一区二区三区| 亚洲国产午夜中文字幕精品黄网站| 久久久亚洲精华液精华液精华液| 亚洲国产精品成人综合色在线| 亚洲人成色在线观看| 亚洲熟妇丰满xxxxx| 亚洲区日韩精品中文字幕| 亚洲综合一区无码精品| 一本天堂ⅴ无码亚洲道久久| 国产AV旡码专区亚洲AV苍井空| 亚洲综合小说另类图片动图| 亚洲欧美乱色情图片| 色偷偷噜噜噜亚洲男人| 国产精品久久久久久亚洲小说| 另类专区另类专区亚洲| 亚洲男人av香蕉爽爽爽爽| 久久久久亚洲av成人无码电影 | 亚洲爽爽一区二区三区| 久久精品国产精品亚洲| 亚洲欧洲日产国码无码网站 | 亚洲人成网站在线播放2019| 蜜桃传媒一区二区亚洲AV| 亚洲VA综合VA国产产VA中| av在线亚洲欧洲日产一区二区| 在线观看亚洲精品国产| 亚洲AV永久青草无码精品| 亚洲欧洲一区二区| 亚洲人成综合在线播放| 亚洲午夜一区二区三区| 亚洲av日韩专区在线观看| 亚洲精品国产V片在线观看| 国产AV无码专区亚洲AWWW | 丰满亚洲大尺度无码无码专线| 亚洲国产精品视频| 国产亚洲av片在线观看16女人| 亚洲a在线视频视频| 亚洲一级毛片在线播放| 亚洲爆乳大丰满无码专区| 亚洲精品国产V片在线观看|