Vue自定義指令及實(shí)現(xiàn)圖片懶加載指令
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
‘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)容。