這是一個(gè)字符串的全角和半角的問(wèn)題,可以導(dǎo)入?unicodedata?中的?normalize?函數(shù)先把全角轉(zhuǎn)換為半角,然后再用?set?對(duì)列表去重,參考代碼如下:
10余年的呼圖壁網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整呼圖壁建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)從事“呼圖壁網(wǎng)站設(shè)計(jì)”,“呼圖壁網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
from?unicodedata?import?normalize
list3=['熱菜','凉菜','涼菜','硬菜']
set(map(lambda?s:?normalize('NFKC',?s),?list3))
輸出:
{'硬菜',?'熱菜',?'涼菜'}
擴(kuò)展:
“?NFKC”代表“Normalization?Form?KC?[Compatibility?Decomposition,?followed?by?Canonical?Composition]”,并將全角字符替換為半角字符,這些半角字符與Unicode等價(jià)。
前兩天處理數(shù)據(jù)的時(shí)候,需要得到兩個(gè)數(shù)據(jù)的交集數(shù)據(jù),所以要去除數(shù)據(jù)中非重復(fù)部分,只保留數(shù)據(jù)中的重復(fù)部分。
?? 網(wǎng)上看了一下大家的教程,大部分都是教去除重復(fù)行,很少有說(shuō)到僅保留重復(fù)行的。所以在這里用drop_duplicates這個(gè)去重函數(shù)來(lái)實(shí)現(xiàn)這個(gè)功能。
drop_duplicates函數(shù)介紹 :
data.drop_duplicates(subset=[‘A’,‘B’],keep=‘first’,inplace=True)
#subset對(duì)應(yīng)的值是列名,表示只考慮這兩列,將這兩列對(duì)應(yīng)值相同的行進(jìn)行去重。
默認(rèn)值為subset=None表示考慮所有列。
keep='first’表示保留第一次出現(xiàn)的重復(fù)行,是默認(rèn)值。
keep另外兩個(gè)取值為"last"和False,分別表示保留最后一次出現(xiàn)的重復(fù)行和去除所有重復(fù)行。
inplace=True表示直接在原來(lái)的DataFrame上刪除重復(fù)項(xiàng),而默認(rèn)值False表示生成一個(gè)副本。
要用函數(shù)取得數(shù)據(jù)集data中的重復(fù)列,分三個(gè)步驟 :
(提前導(dǎo)入pandas模塊)
data0_1 = data.drop_duplicates() #保留第一個(gè)重復(fù)行
data0_2 = data.drop_duplicates(keep=False) #去除所有重復(fù)行
data0_3=pd.concat([data0_1,data0_2]).drop_duplicates(keep=False)
#合并起來(lái)再去重,只剩下真的重復(fù)行。
舉例:data中wangwu行和tony行重復(fù),需要把它們兩行取出。
第一步:#保留第一個(gè)重復(fù)行
第二步:#去除所有重復(fù)行
第三步:#合并起來(lái)再去重
通過(guò)以上步驟實(shí)現(xiàn)取出數(shù)據(jù)中的重復(fù)行。
case1:用集合的特性set(),去重后順序會(huì)改變
case1.1:可以通過(guò)列表中索引(index)的方法保證去重后的順序不變
case2:使用循環(huán)查找的方式,不改變順序
case3:通過(guò)刪除索引
case4:itertools.groupby
case5:fromkeys
case6:reduce方法
df.drop_duplicates('item_name')
方法一:
df.drop_duplicates('item_name').count()
方法二:
df['item_name'].nunique()
結(jié)果:50
附:nunique()和unique()的區(qū)別:
unique()是以 數(shù)組形式(numpy.ndarray)返回列的所有唯一值(特征的所有唯一值)
nunique()即返回的是唯一值的個(gè)數(shù)
比如:df['item_name'].unique()
要求:將下表中經(jīng)驗(yàn)列將按周統(tǒng)計(jì)的轉(zhuǎn)換為經(jīng)驗(yàn)不限,保留學(xué)歷
df1['經(jīng)驗(yàn)'] = df1['經(jīng)驗(yàn)'].apply(lambda x: '經(jīng)驗(yàn)不限'+ x[-2:] if '周' in x else x)
#解釋:將‘5天/周6個(gè)月’變成‘經(jīng)驗(yàn)不限’,然后保留學(xué)歷‘本科’
方法二:定義函數(shù)
def dataInterval(ss):
if '周' in ss:
? ? return '經(jīng)驗(yàn)不限'+ ss[-2:]
return ss
df1['經(jīng)驗(yàn)'] = df1['經(jīng)驗(yàn)'].apply(dataInterval)
python中對(duì)list去重的多種方法
今天遇到一個(gè)問(wèn)題,在同事隨意的提示下,用了 itertools.groupby 這個(gè)函數(shù)。不過(guò)這個(gè)東西最終還是沒(méi)用上。
問(wèn)題就是對(duì)一個(gè)list中的新聞id進(jìn)行去重,去重之后要保證順序不變。
直觀方法
最簡(jiǎn)單的思路就是:
這樣也可行,但是看起來(lái)不夠爽。
用set
另外一個(gè)解決方案就是用set:
代碼如下:
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))
這樣的結(jié)果是沒(méi)有保持原來(lái)的順序。
按照索引再次排序
最后通過(guò)這種方式解決:
代碼如下:
ids = [1,4,3,3,4,2,3,4,5,6,1]
news_ids = list(set(ids))
news_ids.sort(ids.index)
使用itertools.grouby
文章一開始就提到itertools.grouby, 如果不考慮列表順序的話可用這個(gè):
代碼如下:
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids.sort()
it = itertools.groupby(ids)
for k, g in it:
print k
關(guān)于itertools.groupby的原理可以看這里:
網(wǎng)友補(bǔ)充:用reduce
網(wǎng)友reatlk留言給了另外的解決方案。我補(bǔ)充并解釋到這里:
代碼如下:
In [5]: ids = [1,4,3,3,4,2,3,4,5,6,1]
In [6]: func = lambda x,y:x if y in x else x + [y]
In [7]: reduce(func, [[], ] + ids)
Out[7]: [1, 4, 3, 2, 5, 6]
上面是我在ipython中運(yùn)行的代碼,其中的 lambda x,y:x if y in x else x + [y] 等價(jià)于 lambda x,y: y in x and x or x+[y] 。
利用集合的不重復(fù)屬性,可以先轉(zhuǎn)換至集合,再用list()函數(shù)轉(zhuǎn)換回來(lái)即可。
比如,a是一個(gè)列表,a=list(set(a)),即可完成列表去重。