Python 数据分析三剑客之 Pandas(七):合并数据集
CSDN 課程推薦:《邁向數(shù)據(jù)科學(xué)家:帶你玩轉(zhuǎn)Python數(shù)據(jù)分析》,講師齊偉,蘇州研途教育科技有限公司CTO,蘇州大學(xué)應(yīng)用統(tǒng)計(jì)專業(yè)碩士生指導(dǎo)委員會(huì)委員;已出版《跟老齊學(xué)Python:輕松入門(mén)》《跟老齊學(xué)Python:Django實(shí)戰(zhàn)》、《跟老齊學(xué)Python:數(shù)據(jù)分析》和《Python大學(xué)實(shí)用教程》暢銷圖書(shū)。
Pandas 系列文章:
- Python 數(shù)據(jù)分析三劍客之 Pandas(一):認(rèn)識(shí) Pandas 及其 Series、DataFrame 對(duì)象
- Python 數(shù)據(jù)分析三劍客之 Pandas(二):Index 索引對(duì)象以及各種索引操作
- Python 數(shù)據(jù)分析三劍客之 Pandas(三):算術(shù)運(yùn)算與缺失值的處理
- Python 數(shù)據(jù)分析三劍客之 Pandas(四):函數(shù)應(yīng)用、映射、排序和層級(jí)索引
- Python 數(shù)據(jù)分析三劍客之 Pandas(五):統(tǒng)計(jì)計(jì)算與統(tǒng)計(jì)描述
- Python 數(shù)據(jù)分析三劍客之 Pandas(六):GroupBy 數(shù)據(jù)分裂、應(yīng)用與合并
- Python 數(shù)據(jù)分析三劍客之 Pandas(七):合并數(shù)據(jù)集
- Python 數(shù)據(jù)分析三劍客之 Pandas(八):數(shù)據(jù)重塑、重復(fù)數(shù)據(jù)處理與數(shù)據(jù)替換
- Python 數(shù)據(jù)分析三劍客之 Pandas(九):時(shí)間序列
- Python 數(shù)據(jù)分析三劍客之 Pandas(十):數(shù)據(jù)讀寫(xiě)
另有 NumPy、Matplotlib 系列文章已更新完畢,歡迎關(guān)注:
- NumPy 系列文章:https://itrhx.blog.csdn.net/category_9780393.html
- Matplotlib 系列文章:https://itrhx.blog.csdn.net/category_9780418.html
推薦學(xué)習(xí)資料與網(wǎng)站(博主參與部分文檔翻譯):
- NumPy 官方中文網(wǎng):https://www.numpy.org.cn/
- Pandas 官方中文網(wǎng):https://www.pypandas.cn/
- Matplotlib 官方中文網(wǎng):https://www.matplotlib.org.cn/
- NumPy、Matplotlib、Pandas 速查表:https://github.com/TRHX/Python-quick-reference-table
文章目錄
- 【01x00】concat
- 【02x00】append
- 【03x00】merge
- 【03x01】一對(duì)一連接
- 【03x02】多對(duì)一連接
- 【03x03】多對(duì)多連接
- 【03x04】參數(shù) on / left_on / right_on
- 【03x05】參數(shù) how
- 【03x06】參數(shù) suffixes
- 【03x07】參數(shù) left_index / right_index
- 【04x00】join
- 【05x00】四種方法的區(qū)別
這里是一段防爬蟲(chóng)文本,請(qǐng)讀者忽略。 本文原創(chuàng)首發(fā)于 CSDN,作者 TRHX。 博客首頁(yè):https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106830112 未經(jīng)授權(quán),禁止轉(zhuǎn)載!惡意轉(zhuǎn)載,后果自負(fù)!尊重原創(chuàng),遠(yuǎn)離剽竊!
【01x00】concat
pandas.concat 可以沿著指定軸將多個(gè)對(duì)象堆疊到一起。
官方文檔:https://pandas.pydata.org/docs/reference/api/pandas.concat.html
基本語(yǔ)法:
pandas.concat(objs: Union[Iterable[‘DataFrame’], Mapping[Optional[Hashable], ‘DataFrame’]],axis='0',join: str = "'outer'",ignore_index: bool = 'False',keys='None',levels='None',names='None',verify_integrity: bool = 'False',sort: bool = 'False',copy: bool = 'True') → ’DataFrame’ pandas.concat(objs: Union[Iterable[FrameOrSeriesUnion], Mapping[Optional[Hashable], FrameOrSeriesUnion]],axis='0',join: str = "'outer'",ignore_index: bool = 'False',keys='None',levels='None',names='None',verify_integrity: bool = 'False',sort: bool = 'False',copy: bool = 'True') → FrameOrSeriesUnion常用參數(shù)描述:
| objs | Series 或 DataFrame 對(duì)象的序列或映射,要合并的對(duì)象 |
| axis | 沿指定軸合并,0 or ‘index’,1 or ‘columns’,只有在 DataFrame 中才有 1 or 'columns’ |
| join | 如何處理其他軸(或多個(gè)軸)上的索引,可取值:‘inner’,‘outer’(默認(rèn)值) ‘outer’:當(dāng) axis = 0 時(shí),列名相同的列會(huì)合并,其余列都保留(并集),空值填充; ‘inner’:當(dāng) axis = 0 時(shí),列名相同的列會(huì)合并,其余列都舍棄(交集) |
| ignore_index | bool 類型,連接后的值是否使用原索引值,如果為 True,則索引將會(huì)是 0, 1, …, n-1 |
| keys | 序列形式,默認(rèn) None,傳遞 keys 后,會(huì)構(gòu)造一個(gè)層次索引,即 MultiIndex 對(duì)象,keys 為最外層索引 |
| levels | 用于構(gòu)造 MultiIndex 的特定級(jí)別(唯一值)。未指定則將從鍵中推斷出來(lái) |
| names | 列表類型,為索引添加標(biāo)簽 |
| verify_integrity | bool 類型,是否檢查合并后的索引有無(wú)重復(fù)項(xiàng),設(shè)置為 True 若有重復(fù)項(xiàng)則會(huì)報(bào)錯(cuò) |
| sort | 當(dāng) join='outer' 時(shí)對(duì)列索引進(jìn)行排序。當(dāng) join='inner' 時(shí)此操作無(wú)效 |
合并兩個(gè) Series 對(duì)象:
>>> import pandas as pd >>> obj1 = pd.Series(['a', 'b']) >>> obj2 = pd.Series(['c', 'd']) >>> pd.concat([obj1, obj2]) 0 a 1 b 0 c 1 d dtype: object設(shè)置 ignore_index=True,放棄原有的索引值:
>>> import pandas as pd >>> obj1 = pd.Series(['a', 'b']) >>> obj2 = pd.Series(['c', 'd']) >>> pd.concat([obj1, obj2], ignore_index=True) 0 a 1 b 2 c 3 d dtype: object設(shè)置 keys 參數(shù),添加最外層的索引:
>>> import pandas as pd >>> obj1 = pd.Series(['a', 'b']) >>> obj2 = pd.Series(['c', 'd']) >>> pd.concat([obj1, obj2], keys=['s1', 's2']) s1 0 a1 b s2 0 c1 d dtype: object設(shè)置 names 參數(shù),為索引添加標(biāo)簽:
>>> import pandas as pd >>> obj1 = pd.Series(['a', 'b']) >>> obj2 = pd.Series(['c', 'd']) >>> pd.concat([obj1, obj2], keys=['s1', 's2'], names=['Series name', 'Row ID']) Series name Row ID s1 0 a1 b s2 0 c1 d dtype: object合并 DataFrame 對(duì)象:
>>> import pandas as pd >>> obj1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['letter', 'number']) >>> obj2 = pd.DataFrame([['c', 3], ['d', 4]], columns=['letter', 'number']) >>> obj1letter number 0 a 1 1 b 2 >>> >>> obj2letter number 0 c 3 1 d 4 >>> >>> pd.concat([obj1, obj2])letter number 0 a 1 1 b 2 0 c 3 1 d 4合并 DataFrame 對(duì)象,不存在的值將會(huì)被 NaN 填充:
>>> import pandas as pd >>> obj1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['letter', 'number']) >>> obj2 = pd.DataFrame([['c', 3, 'cat'], ['d', 4, 'dog']], columns=['letter', 'number', 'animal']) >>> obj1letter number 0 a 1 1 b 2 >>> >>> obj2letter number animal 0 c 3 cat 1 d 4 dog >>> >>> pd.concat([obj1, obj2])letter number animal 0 a 1 NaN 1 b 2 NaN 0 c 3 cat 1 d 4 dog合并 DataFrame 對(duì)象,設(shè)置 join="inner" 不存在的列將會(huì)舍棄:
>>> import pandas as pd >>> obj1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['letter', 'number']) >>> obj2 = pd.DataFrame([['c', 3, 'cat'], ['d', 4, 'dog']], columns=['letter', 'number', 'animal']) >>> obj1letter number 0 a 1 1 b 2 >>> >>> obj2letter number animal 0 c 3 cat 1 d 4 dog >>> >>> pd.concat([obj1, obj2], join="inner")letter number 0 a 1 1 b 2 0 c 3 1 d 4合并 DataFrame 對(duì)象,設(shè)置 axis=1 沿 y 軸合并(增加列):
>>> import pandas as pd >>> obj1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['letter', 'number']) >>> obj2 = pd.DataFrame([['bird', 'polly'], ['monkey', 'george']], columns=['animal', 'name']) >>> obj1letter number 0 a 1 1 b 2 >>> >>> obj2animal name 0 bird polly 1 monkey george >>> >>> pd.concat([obj1, obj2], axis=1)letter number animal name 0 a 1 bird polly 1 b 2 monkey george設(shè)置 verify_integrity=True ,檢查新的索引是否有重復(fù)項(xiàng),有重復(fù)項(xiàng)會(huì)報(bào)錯(cuò):
>>> import pandas as pd >>> obj1 = pd.DataFrame([1], index=['a']) >>> obj2 = pd.DataFrame([2], index=['a']) >>> obj10 a 1 >>> >>> obj20 a 2 >>> >>> pd.concat([obj1, obj2], verify_integrity=True) Traceback (most recent call last):... ValueError: Indexes have overlapping values: ['a']設(shè)置 sort=True,會(huì)對(duì)列索引進(jìn)行排序輸出:
>>> obj1 = pd.DataFrame([['a', 3], ['d', 2]], columns=['letter', 'number']) >>> obj2 = pd.DataFrame([['c', 1, 'cat'], ['b', 4, 'dog']], columns=['letter', 'number', 'animal']) >>> obj1letter number 0 a 3 1 d 2 >>> >>> obj2letter number animal 0 c 1 cat 1 b 4 dog >>> >>> pd.concat([obj1, obj2], sort=True)animal letter number 0 NaN a 3 1 NaN d 2 0 cat c 1 1 dog b 4【02x00】append
Append 方法事實(shí)上是在一個(gè) Series / DataFrame 對(duì)象后最追加另一個(gè) Series / DataFrame 對(duì)象并返回一個(gè)新對(duì)象,不改變?cè)瓕?duì)象的值。
基本語(yǔ)法:
-
Series.append(self, to_append, ignore_index=False, verify_integrity=False)
-
DataFrame.append(self, other, ignore_index=False, verify_integrity=False, sort=False)
官方文檔:
-
https://pandas.pydata.org/docs/reference/api/pandas.Series.append.html
-
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.append.html
參數(shù)描述:
| to_append / other | 要追加的數(shù)據(jù) |
| ignore_index | bool 類型,連接后的值是否使用原索引值,如果為 True,則索引將會(huì)是 0, 1, …, n-1 |
| verify_integrity | bool 類型,是否檢查合并后的索引有無(wú)重復(fù)項(xiàng),設(shè)置為 True 若有重復(fù)項(xiàng)則會(huì)報(bào)錯(cuò) |
| sort | bool 類型,是否對(duì)列索引(columns)進(jìn)行排序,默認(rèn) False |
合并 Series 對(duì)象:
>>> import pandas as pd >>> obj1 = pd.Series([1, 2, 3]) >>> obj2 = pd.Series([4, 5, 6]) >>> obj3 = pd.Series([4, 5, 6], index=[3, 4, 5]) >>> obj1 0 1 1 2 2 3 dtype: int64 >>> >>> obj2 0 4 1 5 2 6 dtype: int64 >>> >>> obj3 3 4 4 5 5 6 dtype: int64 >>> >>> obj1.append(obj2) 0 1 1 2 2 3 0 4 1 5 2 6 dtype: int64 >>> >>> obj1.append(obj3) 0 1 1 2 2 3 3 4 4 5 5 6 dtype: int64 >>> >>> obj1.append(obj2, ignore_index=True) 0 1 1 2 2 3 3 4 4 5 5 6 dtype: int64 >>> >>> obj1.append(obj2, verify_integrity=True) Traceback (most recent call last): ... ValueError: Indexes have overlapping values: Int64Index([0, 1, 2], dtype='int64')合并 DataFrame 對(duì)象:
>>> import pandas as pd >>> obj1 = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) >>> obj2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) >>> >>> obj1A B 0 1 2 1 3 4 >>> >>> obj2A B 0 5 6 1 7 8 >>> >>> obj1.append(obj2)A B 0 1 2 1 3 4 0 5 6 1 7 8 >>> >>> obj1.append(obj2, ignore_index=True)A B 0 1 2 1 3 4 2 5 6 3 7 8以下雖然不是生成 DataFrames 的推薦方法,但演示了從多個(gè)數(shù)據(jù)源生成 DataFrames 的兩種方法:
>>> import pandas as pd >>> obj = pd.DataFrame(columns=['A']) >>> for i in range(5):obj = obj.append({'A': i}, ignore_index=True)>>> objA 0 0 1 1 2 2 3 3 4 4 >>> import pandas as pd >>> pd.concat([pd.DataFrame([i], columns=['A']) for i in range(5)], ignore_index=True)A 0 0 1 1 2 2 3 3 4 4【03x00】merge
將不同的數(shù)據(jù)源進(jìn)行合并是數(shù)據(jù)科學(xué)中常見(jiàn)的操作,這既包括將兩個(gè)不同的數(shù)據(jù)集非常簡(jiǎn)單地拼接在一起,也包括用數(shù)據(jù)庫(kù)那樣的連接(join)與合并(merge)操作處理有重疊字段的數(shù)據(jù)集。Series 與DataFrame 都具備這類操作,Pandas 的函數(shù)與方法讓數(shù)據(jù)合并變得快速簡(jiǎn)單。
數(shù)據(jù)集的合并(merge)或連接(join)運(yùn)算是通過(guò)一個(gè)或多個(gè)鍵將行連接起來(lái)的。這些運(yùn)算是關(guān)系型數(shù)據(jù)庫(kù)(基于SQL)的核心。Pandas 的 merge 函數(shù)是對(duì)數(shù)據(jù)應(yīng)用這些算法的主要切入點(diǎn)。
pandas.merge 可根據(jù)一個(gè)或多個(gè)連接鍵將不同 DataFrame 中的行連接起來(lái)。
基本語(yǔ)法:
pandas.merge(left,right,how: str = 'inner',on=None,left_on=None,right_on=None,left_index: bool = False,right_index: bool = False,sort: bool = False,suffixes='_x', '_y',copy: bool = True,indicator: bool = False,validate=None) → ’DataFrame’官方文檔:https://pandas.pydata.org/docs/reference/api/pandas.merge.html
常見(jiàn)參數(shù)描述:
| left | 參與合并的左側(cè) DataFrame 對(duì)象 |
| right | 參與合并的右側(cè) DataFrame 對(duì)象 |
| how | 合并方式,默認(rèn) 'inner' 'inner':內(nèi)連接,即使用兩個(gè)對(duì)象中都有的鍵(交集); 'outer':外連接,即使用兩個(gè)對(duì)象中所有的鍵(并集); 'left':左連接,即使用左對(duì)象中所有的鍵; 'right':右連接,即使用右對(duì)象中所有的鍵; |
| on | 用于連接的列名。必須存在于左右兩個(gè) Dataframe對(duì)象中 如果未指定,且其他連接鍵也未指定,則以 left 和 right 列名的交集作為連接鍵 |
| left_on | 左側(cè) DataFrame 對(duì)象中用作連接鍵的列 |
| right_on | 右側(cè) DataFrame 對(duì)象中用作連接鍵的列 |
| left_index | bool 類型,是否使用左側(cè) DataFrame 對(duì)象中的索引(index)作為連接鍵,默認(rèn) False |
| right_index | bool 類型,是否使用右側(cè) DataFrame 對(duì)象中的索引(index)作為連接鍵,默認(rèn) False |
| sort | bool 類型,是否在結(jié)果中按順序?qū)B接鍵排序,默認(rèn) False。 如果為 False,則連接鍵的順序取決于聯(lián)接類型(how 關(guān)鍵字) |
| suffixes | 字符串值元組,用于追加到重疊列名的末尾,默認(rèn)為 ('_x', '_y')。 例如,如果左右兩個(gè) DataFrame 對(duì)象都有 data 列時(shí),則結(jié)果中就會(huì)出現(xiàn) data_x 和 data_y |
【03x01】一對(duì)一連接
一對(duì)一連接是指兩個(gè) DataFrame 對(duì)象的列的值沒(méi)有重復(fù)值。
如果不指定任何參數(shù),調(diào)用 merge 方法,merge 就會(huì)將重疊的列的列名當(dāng)做鍵來(lái)合并。
在下面的示例中,兩個(gè) DataFrame 對(duì)象都有一個(gè)列名為 key 的列,未指定按照哪一列來(lái)合并,merge 就會(huì)默認(rèn)按照 key 來(lái)合并:
>>> import pandas as pd >>> obj1 = pd.DataFrame({'key': ['b', 'a', 'c'], 'data1': range(3)}) >>> obj2 = pd.DataFrame({'key': ['a', 'c', 'b'], 'data2': range(3)}) >>> obj1key data1 0 b 0 1 a 1 2 c 2 >>> >>> obj2key data2 0 a 0 1 c 1 2 b 2 >>> >>> pd.merge(obj1, obj2)key data1 data2 0 b 0 2 1 a 1 0 2 c 2 1【03x02】多對(duì)一連接
多對(duì)一連接是指兩個(gè) DataFrame 對(duì)象中,有一個(gè)的列的值有重復(fù)值。通過(guò)多對(duì)一連接獲得的結(jié)果,DataFrame 將會(huì)保留重復(fù)值。
>>> import pandas as pd >>> obj1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)}) >>> obj2 = pd.DataFrame({'key': ['a', 'b', 'd'], 'data2': range(3)}) >>> >>> obj1key data1 0 b 0 1 b 1 2 a 2 3 c 3 4 a 4 5 a 5 6 b 6 >>> >>> obj2key data2 0 a 0 1 b 1 2 d 2 >>> >>> pd.merge(obj1, obj2)key data1 data2 0 b 0 1 1 b 1 1 2 b 6 1 3 a 2 0 4 a 4 0 5 a 5 0【03x03】多對(duì)多連接
多對(duì)多連接是指兩個(gè) DataFrame 對(duì)象中的列的值都有重復(fù)值。
>>> import pandas as pd >>> obj1 = pd.DataFrame({'key': ['a', 'b', 'b', 'c'], 'data1': range(4)}) >>> obj2 = pd.DataFrame({'key': ['a', 'a', 'b', 'b', 'c', 'c'], 'data2': range(6)}) >>> obj1key data1 0 a 0 1 b 1 2 b 2 3 c 3 >>> >>> obj2key data2 0 a 0 1 a 1 2 b 2 3 b 3 4 c 4 5 c 5 >>> >>> pd.merge(obj1, obj2)key data1 data2 0 a 0 0 1 a 0 1 2 b 1 2 3 b 1 3 4 b 2 2 5 b 2 3 6 c 3 4 7 c 3 5這里是一段防爬蟲(chóng)文本,請(qǐng)讀者忽略。 本文原創(chuàng)首發(fā)于 CSDN,作者 TRHX。 博客首頁(yè):https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106830112 未經(jīng)授權(quán),禁止轉(zhuǎn)載!惡意轉(zhuǎn)載,后果自負(fù)!尊重原創(chuàng),遠(yuǎn)離剽竊!
【03x04】參數(shù) on / left_on / right_on
參數(shù) on 用于指定按照某一列來(lái)進(jìn)行合并,若不指定該參數(shù),則會(huì)默認(rèn)按照重疊的列的列名當(dāng)做鍵來(lái)合并:
>>> import pandas as pd >>> obj1 = pd.DataFrame({'key': ['b', 'a', 'c'], 'data1': range(3)}) >>> obj2 = pd.DataFrame({'key': ['a', 'c', 'b'], 'data2': range(3)}) >>> obj1key data1 0 b 0 1 a 1 2 c 2 >>> >>> obj2key data2 0 a 0 1 c 1 2 b 2 >>> >>> pd.merge(obj1, obj2, on='key')key data1 data2 0 b 0 2 1 a 1 0 2 c 2 1如果要根據(jù)多個(gè)鍵進(jìn)行合并,傳入一個(gè)由列名組成的列表即可:
>>> import pandas as pd >>> left = pd.DataFrame({'key1': ['foo', 'foo', 'bar'],'key2': ['one', 'two', 'one'],'lval': [1, 2, 3]}) >>> right = pd.DataFrame({'key1': ['foo', 'foo', 'bar', 'bar'],'key2': ['one', 'one', 'one', 'two'],'rval': [4, 5, 6, 7]}) >>> leftkey1 key2 lval 0 foo one 1 1 foo two 2 2 bar one 3 >>> >>> rightkey1 key2 rval 0 foo one 4 1 foo one 5 2 bar one 6 3 bar two 7 >>> >>> pd.merge(left, right, on=['key1', 'key2'])key1 key2 lval rval 0 foo one 1 4 1 foo one 1 5 2 bar one 3 6如果兩個(gè)對(duì)象的列名不同,就可以使用 left_on、right_on 參數(shù)分別進(jìn)行指定:
>>> import pandas as pd >>> obj1 = pd.DataFrame({'lkey': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)}) >>> obj2 = pd.DataFrame({'rkey': ['a', 'b', 'd'], 'data2': range(3)}) >>> obj1lkey data1 0 b 0 1 b 1 2 a 2 3 c 3 4 a 4 5 a 5 6 b 6 >>> >>> obj2rkey data2 0 a 0 1 b 1 2 d 2 >>> >>> pd.merge(obj1, obj2, left_on='lkey', right_on='rkey')lkey data1 rkey data2 0 b 0 b 1 1 b 1 b 1 2 b 6 b 1 3 a 2 a 0 4 a 4 a 0 5 a 5 a 0【03x05】參數(shù) how
在前面的示例中,結(jié)果里面 c 和 d 以及與之相關(guān)的數(shù)據(jù)消失了。默認(rèn)情況下,merge 做的是內(nèi)連接('inner'),結(jié)果中的鍵是交集。其他方式還有:'left'、'right'、'outer',含義如下:
- 'inner':內(nèi)連接,即使用兩個(gè)對(duì)象中都有的鍵(交集);
- 'outer':外連接,即使用兩個(gè)對(duì)象中所有的鍵(并集);
- 'left':左連接,即使用左對(duì)象中所有的鍵;
- 'right':右連接,即使用右對(duì)象中所有的鍵;
【03x06】參數(shù) suffixes
suffixes 參數(shù)用于指定附加到左右兩個(gè) DataFrame 對(duì)象的重疊列名上的字符串:
在以下示例中,選擇按照 key1 進(jìn)行合并,而兩個(gè) DataFrame 對(duì)象都包含 key2 列,如果未指定 suffixes 參數(shù),則默認(rèn)會(huì)為兩個(gè)對(duì)象的 key2 加上 _x 和 _y,以便區(qū)分它們,如果指定了 suffixes 參數(shù),就會(huì)按照添加指定的后綴:
>>> import pandas as pd >>> left = pd.DataFrame({'key1': ['foo', 'foo', 'bar'],'key2': ['one', 'two', 'one'],'lval': [1, 2, 3]}) >>> right = pd.DataFrame({'key1': ['foo', 'foo', 'bar', 'bar'],'key2': ['one', 'one', 'one', 'two'],'rval': [4, 5, 6, 7]}) >>> leftkey1 key2 lval 0 foo one 1 1 foo two 2 2 bar one 3 >>> >>> rightkey1 key2 rval 0 foo one 4 1 foo one 5 2 bar one 6 3 bar two 7 >>> >>> pd.merge(left, right, on='key1')key1 key2_x lval key2_y rval 0 foo one 1 one 4 1 foo one 1 one 5 2 foo two 2 one 4 3 foo two 2 one 5 4 bar one 3 one 6 5 bar one 3 two 7 >>> >>> pd.merge(left, right, on='key1', suffixes=('_left', '_right'))key1 key2_left lval key2_right rval 0 foo one 1 one 4 1 foo one 1 one 5 2 foo two 2 one 4 3 foo two 2 one 5 4 bar one 3 one 6 5 bar one 3 two 7【03x07】參數(shù) left_index / right_index
有時(shí)候,DataFrame 中的連接鍵位于其索引中。在這種情況下,可以使用 left_index=True 或right_index=True(或兩個(gè)都傳)以說(shuō)明索引應(yīng)該被用作連接鍵。這種方法稱為按索引連接,在 Pandas 中還有個(gè) join 方法可以實(shí)現(xiàn)這個(gè)功能。
在以下示例中,按照 left 的 key 列進(jìn)行連接,而 right 對(duì)象的連接鍵位于其索引中,因此要指定 right_index=True:
>>> import pandas as pd >>> left = pd.DataFrame({'key': ['a', 'b', 'a', 'a', 'b', 'c'], 'value': range(6)}) >>> right = pd.DataFrame({'group_val': [3.5, 7]}, index=['a', 'b']) >>> leftkey value 0 a 0 1 b 1 2 a 2 3 a 3 4 b 4 5 c 5 >>> >>> rightgroup_val a 3.5 b 7.0 >>> >>> pd.merge(left, right, left_on='key', right_index=True)key value group_val 0 a 0 3.5 2 a 2 3.5 3 a 3 3.5 1 b 1 7.0 4 b 4 7.0【04x00】join
join 方法只適用于 DataFrame 對(duì)象,Series 對(duì)象沒(méi)有該方法,該方法用于連接另一個(gè) DataFrame 對(duì)象的列(columns)。
基本語(yǔ)法:DataFrame.join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False) → ’DataFrame’
參數(shù)描述:
| other | 另一個(gè) DataFrame、Series 或 DataFrame 列表對(duì)象 |
| on | 列名稱,或者列名稱組成的列表、元組,連接的列 |
| how | 合并方式,默認(rèn) 'left' 'inner':內(nèi)連接,即使用兩個(gè)對(duì)象中都有的鍵(交集); 'outer':外連接,即使用兩個(gè)對(duì)象中所有的鍵(并集); 'left':左連接,即使用左對(duì)象中所有的鍵; 'right':右連接,即使用右對(duì)象中所有的鍵; |
| lsuffix | 當(dāng)兩個(gè)對(duì)象有相同的列名時(shí),合并后左邊數(shù)據(jù)列名的后綴 |
| rsuffix | 當(dāng)兩個(gè)對(duì)象有相同的列名時(shí),合并后右邊數(shù)據(jù)列名的后綴 |
| sort | bool 類型,是否在結(jié)果中按順序?qū)B接鍵排序,默認(rèn) False。 如果為 False,則連接鍵的順序取決于聯(lián)接類型(how 關(guān)鍵字) |
使用 lsuffix 和 rsuffix 參數(shù):
>>> import pandas as pd >>> obj = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3', 'K4', 'K5'],'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']}) >>> other = pd.DataFrame({'key': ['K0', 'K1', 'K2'],'B': ['B0', 'B1', 'B2']}) >>> objkey A 0 K0 A0 1 K1 A1 2 K2 A2 3 K3 A3 4 K4 A4 5 K5 A5 >>> >>> otherkey B 0 K0 B0 1 K1 B1 2 K2 B2 >>> >>> obj.join(other, lsuffix='_1', rsuffix='_2')key_1 A key_2 B 0 K0 A0 K0 B0 1 K1 A1 K1 B1 2 K2 A2 K2 B2 3 K3 A3 NaN NaN 4 K4 A4 NaN NaN 5 K5 A5 NaN NaN如果右表的索引是左表的某一列的值,這時(shí)可以將右表的索引和左表的列對(duì)齊合并這樣的靈活方式進(jìn)行合并:
>>> import pandas as pd >>> obj = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'],'key': ['K0', 'K1', 'K0', 'K1']}) >>> other = pd.DataFrame({'C': ['C0', 'C1'],'D': ['D0', 'D1']},index=['K0', 'K1']) >>> objA B key 0 A0 B0 K0 1 A1 B1 K1 2 A2 B2 K0 3 A3 B3 K1 >>> >>> otherC D K0 C0 D0 K1 C1 D1 >>> >>> obj.join(other, on='key')A B key C D 0 A0 B0 K0 C0 D0 1 A1 B1 K1 C1 D1 2 A2 B2 K0 C0 D0 3 A3 B3 K1 C1 D1【05x00】四種方法的區(qū)別
-
concat:可用于兩個(gè)或多個(gè) Series 或 DataFrame 對(duì)象間,通過(guò) axis 參數(shù)指定按照行方向(增加行)或列方向(增加列)進(jìn)合并操作,默認(rèn)行合并(增加行),取并集;
-
append:在一個(gè) Series 或 DataFrame 對(duì)象后最追加另一個(gè) Series 或 DataFrame 對(duì)象并返回一個(gè)新對(duì)象,不改變?cè)瓕?duì)象的值。只能按行合并(增加行)。
-
merge:只能對(duì)兩個(gè) DataFrame 對(duì)象進(jìn)行合并,一般按照列方向(增加列)進(jìn)行合并操作,按照行方向合并一般用 join 方法代替,默認(rèn)列合并(增加列),取交集;
-
join:只能對(duì)兩個(gè) DataFrame 對(duì)象進(jìn)行合并,按照列方向(增加列)進(jìn)行合并操作,默認(rèn)左連接。
這里是一段防爬蟲(chóng)文本,請(qǐng)讀者忽略。 本文原創(chuàng)首發(fā)于 CSDN,作者 TRHX。 博客首頁(yè):https://itrhx.blog.csdn.net/ 本文鏈接:https://itrhx.blog.csdn.net/article/details/106830112 未經(jīng)授權(quán),禁止轉(zhuǎn)載!惡意轉(zhuǎn)載,后果自負(fù)!尊重原創(chuàng),遠(yuǎn)離剽竊!
總結(jié)
以上是生活随笔為你收集整理的Python 数据分析三剑客之 Pandas(七):合并数据集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 网友不相信高通骁龙8+会有惊喜 雷军:不
- 下一篇: 最大10克拉 中国科学家30年攻关掌握人