99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁(yè)大數(shù)據(jù)時(shí)代pandas的merge操作,像數(shù)據(jù)庫(kù)一樣盡情join
pandas的merge操作,像數(shù)據(jù)庫(kù)一樣盡情join
2020-08-18
收藏

作者:梁唐

來(lái)源:早起Python

今天是我們一起來(lái)聊聊pandas中dataframe的合并。

常見(jiàn)的數(shù)據(jù)合并操作主要有兩種,第一種是我們新生成了新的特征,想要把它和舊的特征合并在一起。第二種是我們新獲取了一份數(shù)據(jù)集,想要擴(kuò)充舊的數(shù)據(jù)集。這兩種合并操作在我們?nèi)粘5墓ぷ鳟?dāng)中非常尋常,那么究竟應(yīng)該怎么操作呢?讓我們一個(gè)一個(gè)來(lái)看。

merge

首先我們來(lái)看dataframe當(dāng)中的merge操作,merge操作類似于數(shù)據(jù)庫(kù)當(dāng)中兩張表的join,可以通過(guò)一個(gè)或者多個(gè)key將多個(gè)dataframe鏈接起來(lái)。

我們首先來(lái)創(chuàng)建兩個(gè)dataframe數(shù)據(jù):

df1 = pd.DataFrame({'id': [1, 2, 3, 3, 5, 7, 6], 'age': range(7)})

df2 = pd.DataFrame({'id': [1, 2, 4, 4, 5, 6, 7], 'score': range(7)})

我們可以看到這兩個(gè)dataframe當(dāng)中都有id這個(gè)字段,如果我們想要將它們根據(jù)id關(guān)聯(lián)起來(lái),我們可以用pd.merge函數(shù)完成:

這里雖然我們沒(méi)有指定根據(jù)哪一列完成關(guān)聯(lián),但是pandas會(huì)自動(dòng)尋找兩個(gè)dataframe的名稱相同列來(lái)進(jìn)行關(guān)聯(lián)。一般情況下我們不這么干,還是推薦大家指定列名。指定列名很簡(jiǎn)單,我們只需要傳入on這個(gè)參數(shù)即可。

如果需要根據(jù)多列關(guān)聯(lián),我們也可以傳入一個(gè)數(shù)組。但假如兩個(gè)dataframe當(dāng)中的列名不一致怎么辦,比如這兩個(gè)dataframe當(dāng)中的一列叫做id,一列叫做number,該怎么完成join呢?

df1 = pd.DataFrame({'id': [1, 2, 3, 3, 5, 7, 6], 'age': range(7)})

df2 = pd.DataFrame({'number': [1, 2, 4, 4, 5, 6, 7], 'score': range(7)})

這個(gè)時(shí)候就需要用left_on指定左表用來(lái)join的列名,用right_on指定右表用來(lái)join的列名。

談到j(luò)oin,不得不提另外一個(gè)問(wèn)題就是join的方式。我們都知道在數(shù)據(jù)庫(kù)的表join操作當(dāng)中我們通常的join方式有4種。分別是innner join,left join,right join和outer join。我們觀察一下上面的結(jié)果會(huì)發(fā)現(xiàn)關(guān)聯(lián)之后的數(shù)據(jù)條數(shù)變少了,這是因?yàn)槟J(rèn)的方式是inner join,也就是兩張表當(dāng)中都存在的數(shù)據(jù)才會(huì)被保留。如果是left join,那邊左邊當(dāng)中所有的數(shù)據(jù)都會(huì)保留,關(guān)聯(lián)不上的列置為None,同理,如果是right join,則右表全部保留,outer join則會(huì)全部保留。

join的方式選擇通過(guò)how這個(gè)參數(shù)控制,比如如果我們想要左表保留,我們傳入how='left'即可。

除此之外,merge操作還有一些其他的參數(shù),由于篇幅限制我們不一一介紹了,大家感興趣可以去查閱相關(guān)文檔。

數(shù)據(jù)合并

另外一個(gè)常用的操作叫做數(shù)據(jù)合并,為了和merge操作區(qū)分,我用了中文。雖然同樣是合并,但是它的邏輯和merge是不同的。對(duì)于merge來(lái)說(shuō),我們需要關(guān)聯(lián)的key,是通過(guò)數(shù)據(jù)關(guān)聯(lián)上之后再合并的。而合并操作是直接的合并,行對(duì)行合并或者是列對(duì)列合并,是忽視數(shù)據(jù)的合并。

這個(gè)合并操作我們之前在numpy的介紹當(dāng)中曾經(jīng)也提到過(guò),我們這里簡(jiǎn)單回顧一下。

首先我們先創(chuàng)建一個(gè)numpy的數(shù)組:

import numpy as np
arr = np.random.rand(3, 4)

之后呢,我們可以用concatenate函數(shù)把這個(gè)數(shù)組橫著拼或者是豎著拼,默認(rèn)是豎著拼:

我們也可以通過(guò)axis這個(gè)參數(shù)讓它變成橫著拼:

對(duì)于dataframe同樣也有這樣的操作,不過(guò)換了一個(gè)名字叫做concat。如果我們不指定的話會(huì)豎著拼接:

豎著拼接的時(shí)候會(huì)按照列進(jìn)行對(duì)齊,如果列名對(duì)不上就會(huì)填充NaN。

通過(guò)axis參數(shù)我們可以讓它橫向拼接:

以上就是concat的基本用法了,除了基本用法之外,concat還有一些其他的應(yīng)用,比如說(shuō)處理index層次索引等等。只是這些用法相對(duì)來(lái)說(shuō)比較小眾,使用頻率不高,就不贅述了。

數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說(shuō)明請(qǐng)參見(jiàn):http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }