前兩天處理數(shù)據(jù)的時(shí)候,需要得到兩個(gè)數(shù)據(jù)的交集數(shù)據(jù),所以要去除數(shù)據(jù)中非重復(fù)部分,只保留數(shù)據(jù)中的重復(fù)部分。
網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了烏翠免費(fèi)建站歡迎大家使用!
?? 網(wǎng)上看了一下大家的教程,大部分都是教去除重復(fù)行,很少有說到僅保留重復(fù)行的。所以在這里用drop_duplicates這個(gè)去重函數(shù)來實(shí)現(xiàn)這個(gè)功能。
drop_duplicates函數(shù)介紹 :
data.drop_duplicates(subset=[‘A’,‘B’],keep=‘first’,inplace=True)
#subset對應(yīng)的值是列名,表示只考慮這兩列,將這兩列對應(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表示直接在原來的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)
#合并起來再去重,只剩下真的重復(fù)行。
舉例:data中wangwu行和tony行重復(fù),需要把它們兩行取出。
第一步:#保留第一個(gè)重復(fù)行
第二步:#去除所有重復(fù)行
第三步:#合并起來再去重
通過以上步驟實(shí)現(xiàn)取出數(shù)據(jù)中的重復(fù)行。
1、運(yùn)用新建字典的方式,去除重復(fù)的鍵
2、利用集合,直接將列表轉(zhuǎn)化為集合,自動(dòng)去重后轉(zhuǎn)回列表。有一個(gè)問題,轉(zhuǎn)換為集合的同時(shí),數(shù)據(jù)無序了。
3、用列表的推導(dǎo)式
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)
代碼如下:
def func1(num_list):
if len(num_list) != len(set(num_list)):
return True
else:
return False
if __name__ == '__main__':
num_list = [[1, 2, 3, 4], [6, 7, 8], [4, 5, 6, 6, 6]]
for one_list in num_list:
print(func1(one_list))
運(yùn)行結(jié)果:
擴(kuò)展資料
python對列表去重的幾種方式:
1、直觀方法,先建立一個(gè)新的空列表,通過遍歷原來的列表,再利用邏輯關(guān)系not in 來去重??偨Y(jié):這樣可以做出來,但是過程不夠簡單。但是此方法保證了列表的順序性。
2、利用set的自動(dòng)去重功能,將列表轉(zhuǎn)化為集合再轉(zhuǎn)化為列表,利用集合的自動(dòng)去重功能。簡單快速。缺點(diǎn)是:使用set方法無法保證去重后的順序。
參考資料:python官網(wǎng)-Doc語法文檔
python中對list去重的多種方法
今天遇到一個(gè)問題,在同事隨意的提示下,用了 itertools.groupby 這個(gè)函數(shù)。不過這個(gè)東西最終還是沒用上。
問題就是對一個(gè)list中的新聞id進(jìn)行去重,去重之后要保證順序不變。
直觀方法
最簡單的思路就是:
這樣也可行,但是看起來不夠爽。
用set
另外一個(gè)解決方案就是用set:
代碼如下:
ids = [1,4,3,3,4,2,3,4,5,6,1]
ids = list(set(ids))
這樣的結(jié)果是沒有保持原來的順序。
按照索引再次排序
最后通過這種方式解決:
代碼如下:
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] 。
如:arr =['a','d','e','a']
用: arr= sorted(set(arr), key=arr.index)
同: arr = list(set(arr))
arr.sort(key=arr.index)
??直接set(arr)也可以去除重復(fù)元素,只是新數(shù)組的順序就不是原來的順序了。
如:arr=[{'text':wuyuan,'value':1},{'text':默認(rèn),'value':2},{'text':默認(rèn),'value':2},
{'text':wyy,'value':4}]
用: f = lambda x,y:x if y in x else x + [y]
arr = reduce(f, [[], ] + arr)
??這里去除的字典里面的鍵值對必須是完全一樣的。
網(wǎng)站題目:python剔重函數(shù) python剔除函數(shù)
當(dāng)前網(wǎng)址:http://jinyejixie.com/article34/hpccse.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、全網(wǎng)營銷推廣、移動(dòng)網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站、Google、ChatGPT
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)