Pandas中Dataframe合并的實(shí)現(xiàn)
簡(jiǎn)介
Pandas提供了很多合并Series和Dataframe的強(qiáng)大的功能,通過這些功能可以方便的進(jìn)行數(shù)據(jù)分析。本文將會(huì)詳細(xì)講解如何使用Pandas來合并Series和Dataframe。
使用concat
concat是最常用的合并DF的方法,先看下concat的定義:
pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
看一下我們經(jīng)常會(huì)用到的幾個(gè)參數(shù):
- objs是Series或者Series的序列或者映射。
- axis指定連接的軸。
join
: {‘inner’, ‘outer’}, 連接方式,怎么處理其他軸的index,outer表示合并,inner表示交集。- ignore_index: 忽略原本的index值,使用0,1,… n-1來代替。
- copy:是否進(jìn)行拷貝。
- keys:指定最外層的多層次結(jié)構(gòu)的index。
我們先定義幾個(gè)DF,然后看一下怎么使用concat把這幾個(gè)DF連接起來:
In [1]: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], ...: 'B': ['B0', 'B1', 'B2', 'B3'], ...: 'C': ['C0', 'C1', 'C2', 'C3'], ...: 'D': ['D0', 'D1', 'D2', 'D3']}, ...: index=[0, 1, 2, 3]) ...: In [2]: df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'], ...: 'B': ['B4', 'B5', 'B6', 'B7'], ...: 'C': ['C4', 'C5', 'C6', 'C7'], ...: 'D': ['D4', 'D5', 'D6', 'D7']}, ...: index=[4, 5, 6, 7]) ...: In [3]: df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'], ...: 'B': ['B8', 'B9', 'B10', 'B11'], ...: 'C': ['C8', 'C9', 'C10', 'C11'], ...: 'D': ['D8', 'D9', 'D10', 'D11']}, ...: index=[8, 9, 10, 11]) ...: In [4]: frames = [df1, df2, df3] In [5]: result = pd.concat(frames)
df1,df2,df3定義了同樣的列名和不同的index,然后將他們放在frames中構(gòu)成了一個(gè)DF的list,將其作為參數(shù)傳入concat就可以進(jìn)行DF的合并。
舉個(gè)多層級(jí)的例子:
In [6]: result = pd.concat(frames, keys=['x', 'y', 'z'])
使用keys可以指定frames中不同frames的key。
使用的時(shí)候,我們可以通過選擇外部的key來返回特定的frame:
In [7]: result.loc['y'] Out[7]: A B C D 4 A4 B4 C4 D4 5 A5 B5 C5 D5 6 A6 B6 C6 D6 7 A7 B7 C7 D7
上面的例子連接的軸默認(rèn)是0,也就是按行來進(jìn)行連接,下面我們來看一個(gè)例子按列來進(jìn)行連接,如果要按列來連接,可以指定axis=1:
In [8]: df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'], ...: 'D': ['D2', 'D3', 'D6', 'D7'], ...: 'F': ['F2', 'F3', 'F6', 'F7']}, ...: index=[2, 3, 6, 7]) ...: In [9]: result = pd.concat([df1, df4], axis=1, sort=False)
默認(rèn)的 join='outer'
,合并之后index不存在的地方會(huì)補(bǔ)全為NaN。
下面看一個(gè)join='inner’的情況:
In [10]: result = pd.concat([df1, df4], axis=1, join='inner')
join=‘inner’ 只會(huì)選擇index相同的進(jìn)行展示。
如果合并之后,我們只想保存原來frame的index相關(guān)的數(shù)據(jù),那么可以使用reindex:
In [11]: result = pd.concat([df1, df4], axis=1).reindex(df1.index)
或者這樣:
In [12]: pd.concat([df1, df4.reindex(df1.index)], axis=1) Out[12]: A B C D B D F 0 A0 B0 C0 D0 NaN NaN NaN 1 A1 B1 C1 D1 NaN NaN NaN 2 A2 B2 C2 D2 B2 D2 F2 3 A3 B3 C3 D3 B3 D3 F3
看下結(jié)果:
可以合并DF和Series:
In [18]: s1 = pd.Series(['X0', 'X1', 'X2', 'X3'], name='X') In [19]: result = pd.concat([df1, s1], axis=1)
如果是多個(gè)Series,使用concat可以指定列名:
In [23]: s3 = pd.Series([0, 1, 2, 3], name='foo') In [24]: s4 = pd.Series([0, 1, 2, 3]) In [25]: s5 = pd.Series([0, 1, 4, 5])
In [27]: pd.concat([s3, s4, s5], axis=1, keys=['red', 'blue', 'yellow']) Out[27]: red blue yellow 0 0 0 0 1 1 1 1 2 2 2 4 3 3 3 5
使用append
append可以看做是concat的簡(jiǎn)化版本,它沿著axis=0
進(jìn)行concat:
In [13]: result = df1.append(df2)
如果append的兩個(gè) DF的列是不一樣的會(huì)自動(dòng)補(bǔ)全NaN:
In [14]: result = df1.append(df4, sort=False)
如果設(shè)置ignore_index=True,可以忽略原來的index,并重寫分配index:
In [17]: result = df1.append(df4, ignore_index=True, sort=False)
向DF append一個(gè)Series:
In [35]: s2 = pd.Series(['X0', 'X1', 'X2', 'X3'], index=['A', 'B', 'C', 'D']) In [36]: result = df1.append(s2, ignore_index=True)
使用merge
和DF最類似的就是數(shù)據(jù)庫(kù)的表格,可以使用merge來進(jìn)行類似數(shù)據(jù)庫(kù)操作的DF合并操作。
先看下merge的定義:
pd.merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None)
Left, right是要合并的兩個(gè)DF 或者 Series。
on代表的是join的列或者index名。
- left_on:左連接
right_on
:右連接left_index
: 連接之后,選擇使用左邊的index或者column。right_index
:連接之后,選擇使用右邊的index或者column。
how:連接的方式,'left'
, 'right'
, 'outer'
, 'inner'
. 默認(rèn) inner
.
sort
: 是否排序。suffixes
: 處理重復(fù)的列。copy
: 是否拷貝數(shù)據(jù)
先看一個(gè)簡(jiǎn)單merge的例子:
In [39]: left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], ....: 'A': ['A0', 'A1', 'A2', 'A3'], ....: 'B': ['B0', 'B1', 'B2', 'B3']}) ....: In [40]: right = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'], ....: 'C': ['C0', 'C1', 'C2', 'C3'], ....: 'D': ['D0', 'D1', 'D2', 'D3']}) ....: In [41]: result = pd.merge(left, right, on='key')
上面兩個(gè)DF通過key來進(jìn)行連接。
再看一個(gè)多個(gè)key連接的例子:
In [42]: left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'], ....: 'key2': ['K0', 'K1', 'K0', 'K1'], ....: 'A': ['A0', 'A1', 'A2', 'A3'], ....: 'B': ['B0', 'B1', 'B2', 'B3']}) ....: In [43]: right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'], ....: 'key2': ['K0', 'K0', 'K0', 'K0'], ....: 'C': ['C0', 'C1', 'C2', 'C3'], ....: 'D': ['D0', 'D1', 'D2', 'D3']}) ....: In [44]: result = pd.merge(left, right, on=['key1', 'key2'])
How 可以指定merge方式,和數(shù)據(jù)庫(kù)一樣,可以指定是內(nèi)連接,外連接等:
合并方法 | SQL 方法 |
---|---|
left | LEFT OUTER JOIN |
right | RIGHT OUTER JOIN |
outer | FULL OUTER JOIN |
inner | INNER JOIN |
In [45]: result = pd.merge(left, right, how='left', on=['key1', 'key2'])
指定indicator=True ,可以表示具體行的連接方式:
In [60]: df1 = pd.DataFrame({'col1': [0, 1], 'col_left': ['a', 'b']}) In [61]: df2 = pd.DataFrame({'col1': [1, 2, 2], 'col_right': [2, 2, 2]}) In [62]: pd.merge(df1, df2, on='col1', how='outer', indicator=True) Out[62]: col1 col_left col_right _merge 0 0 a NaN left_only 1 1 b 2.0 both 2 2 NaN 2.0 right_only 3 2 NaN 2.0 right_only
如果傳入字符串給indicator,會(huì)重命名indicator這一列的名字:
In [63]: pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column') Out[63]: col1 col_left col_right indicator_column 0 0 a NaN left_only 1 1 b 2.0 both 2 2 NaN 2.0 right_only 3 2 NaN 2.0 right_only
多個(gè)index進(jìn)行合并:
In [112]: leftindex = pd.MultiIndex.from_tuples([('K0', 'X0'), ('K0', 'X1'), .....: ('K1', 'X2')], .....: names=['key', 'X']) .....: In [113]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'], .....: 'B': ['B0', 'B1', 'B2']}, .....: index=leftindex) .....: In [114]: rightindex = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'), .....: ('K2', 'Y2'), ('K2', 'Y3')], .....: names=['key', 'Y']) .....: In [115]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'], .....: 'D': ['D0', 'D1', 'D2', 'D3']}, .....: index=rightindex) .....: In [116]: result = pd.merge(left.reset_index(), right.reset_index(), .....: on=['key'], how='inner').set_index(['key', 'X', 'Y'])
支持多個(gè)列的合并:
In [117]: left_index = pd.Index(['K0', 'K0', 'K1', 'K2'], name='key1') In [118]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], .....: 'B': ['B0', 'B1', 'B2', 'B3'], .....: 'key2': ['K0', 'K1', 'K0', 'K1']}, .....: index=left_index) .....: In [119]: right_index = pd.Index(['K0', 'K1', 'K2', 'K2'], name='key1') In [120]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'], .....: 'D': ['D0', 'D1', 'D2', 'D3'], .....: 'key2': ['K0', 'K0', 'K0', 'K1']}, .....: index=right_index) .....: In [121]: result = left.merge(right, on=['key1', 'key2'])
使用join
join將兩個(gè)不同index的DF合并成一個(gè)。可以看做是merge的簡(jiǎn)寫。
In [84]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'], ....: 'B': ['B0', 'B1', 'B2']}, ....: index=['K0', 'K1', 'K2']) ....: In [85]: right = pd.DataFrame({'C': ['C0', 'C2', 'C3'], ....: 'D': ['D0', 'D2', 'D3']}, ....: index=['K0', 'K2', 'K3']) ....: In [86]: result = left.join(right)
可以指定how來指定連接方式:
In [87]: result = left.join(right, how='outer')
默認(rèn)join是按index來進(jìn)行連接。
還可以按照列來進(jìn)行連接:
In [91]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], ....: 'B': ['B0', 'B1', 'B2', 'B3'], ....: 'key': ['K0', 'K1', 'K0', 'K1']}) ....: In [92]: right = pd.DataFrame({'C': ['C0', 'C1'], ....: 'D': ['D0', 'D1']}, ....: index=['K0', 'K1']) ....: In [93]: result = left.join(right, on='key')
單個(gè)index和多個(gè)index進(jìn)行join:
In [100]: left = pd.DataFrame({'A': ['A0', 'A1', 'A2'], .....: 'B': ['B0', 'B1', 'B2']}, .....: index=pd.Index(['K0', 'K1', 'K2'], name='key')) .....: In [101]: index = pd.MultiIndex.from_tuples([('K0', 'Y0'), ('K1', 'Y1'), .....: ('K2', 'Y2'), ('K2', 'Y3')], .....: names=['key', 'Y']) .....: In [102]: right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'], .....: 'D': ['D0', 'D1', 'D2', 'D3']}, .....: index=index) .....: In [103]: result = left.join(right, how='inner')
列名重復(fù)的情況:
In [122]: left = pd.DataFrame({'k': ['K0', 'K1', 'K2'], 'v': [1, 2, 3]}) In [123]: right = pd.DataFrame({'k': ['K0', 'K0', 'K3'], 'v': [4, 5, 6]}) In [124]: result = pd.merge(left, right, on='k')
可以自定義重復(fù)列名的命名規(guī)則:
In [125]: result = pd.merge(left, right, on='k', suffixes=('_l', '_r'))
覆蓋數(shù)據(jù)
有時(shí)候我們需要使用DF2的數(shù)據(jù)來填充DF1的數(shù)據(jù),這時(shí)候可以使用combine_first:
In [131]: df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan], .....: [np.nan, 7., np.nan]]) .....: In [132]: df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]], .....: index=[1, 2]) .....:
In [133]: result = df1.combine_first(df2)
或者使用update:
In [134]: df1.update(df2)
到此這篇關(guān)于Pandas中Dataframe合并的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Pandas Dataframe合并內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)MySQL操作的方法小結(jié)【安裝,連接,增刪改查等】
這篇文章主要介紹了Python實(shí)現(xiàn)MySQL操作的方法,結(jié)合實(shí)例形式分析了Python針對(duì)mysql的安裝,連接,增刪改查等操作實(shí)現(xiàn)方法,需要的朋友可以參考下2017-07-07python實(shí)現(xiàn)人性化顯示金額數(shù)字實(shí)例詳解
在本篇內(nèi)容里小編給大家整理了關(guān)于python實(shí)現(xiàn)人性化顯示金額數(shù)字實(shí)例內(nèi)容,需要的朋友們可以參考下。2020-09-09python進(jìn)階教程之函數(shù)參數(shù)的多種傳遞方法
這篇文章主要介紹了python進(jìn)階教程之函數(shù)參數(shù)的多種傳遞方法,包括關(guān)鍵字傳遞、默認(rèn)值傳遞、包裹位置傳遞、包裹關(guān)鍵字混合傳遞等,需要的朋友可以參考下2014-08-08Pytorch教程內(nèi)置模型源碼實(shí)現(xiàn)
本文是關(guān)于Pytorch教程文章,本篇主要為教大家Pytorch內(nèi)置模型源碼實(shí)現(xiàn),有需要的朋友可以借鑒參考下,希望可以有所幫助,祝大家多多進(jìn)步,早日升職加薪2021-09-09python字典根據(jù)key排序的實(shí)現(xiàn)
本文主要介紹了python字典根據(jù)key排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01Python圖像運(yùn)算之圖像掩膜直方圖和HS直方圖詳解
這篇文章將為大家詳細(xì)講解圖像掩膜直方圖和HS直方圖,并分享一個(gè)通過直方圖判斷白天與黑夜的案例。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2022-08-08搭建?Selenium+Python開發(fā)環(huán)境詳細(xì)步驟
這篇文章主要介紹了搭建?Selenium+Python開發(fā)環(huán)境詳細(xì)步驟的相關(guān)資料,需要的朋友可以參考下2022-10-10