国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Pandas之旅(三)最實(shí)用的Merge, Join,Concat方法詳解

Merge, Join, Concat

大家好,我有回來啦,這周更新的有點(diǎn)慢,主要是因?yàn)槲腋铝藗€(gè)人簡歷哈哈,如果感興趣的朋友可以去看看哈:

個(gè)人認(rèn)為還是很漂亮的~,不得不說,很多時(shí)候老外的設(shè)計(jì)能力還是很強(qiáng)。

好了,有點(diǎn)扯遠(yuǎn)了,這一期我想和大家分享的是pandas中最常見的幾種方法,這些方法如果你學(xué)會(huì)了,某種程度上可以很好的替代Excel,這篇文章是pandas之旅的第三篇,主要會(huì)從以下幾個(gè)方面和大家分享我的心得體會(huì):

  1. Merge

  2. Join

  3. Concat

  4. 源碼及GitHub地址

話不多說,讓我們開始今天的Pandas之旅吧!

1. Merge

首先merge的操作非常類似sql里面的join,實(shí)現(xiàn)將兩個(gè)Dataframe根據(jù)一些共有的列連接起來,當(dāng)然,在實(shí)際場景中,這些共有列一般是Id,
連接方式也豐富多樣,可以選擇inner(默認(rèn)),left,right,outer 這幾種模式,分別對(duì)應(yīng)的是內(nèi)連接,左連接,右連接

1.1 InnerMerge (內(nèi)連接)

首先讓我們簡單的創(chuàng)建兩個(gè)DF,分別為DataFrame1,DataFrame2,他們的公有列是key

import numpy as npimport pandas as pdfrom pandas import Series, DataFrame
# Let's make a dframedframe1 = DataFrame({'key':['X','Z','Y','Z','X','X'],'value_df1': np.arange(6)})dframe1

keyvalue_df1
0X0
1Z1
2Y2
3Z3
4X4
5X5
#Now lets make another dframedframe2 = DataFrame({'key':['Q','Y','Z'],'value_df2':[1,2,3]})dframe2

keyvalue_df2
0Q1
1Y2
2Z3

我們現(xiàn)在可以簡單地使用pd.merge(dframe1,dframe2)來實(shí)現(xiàn)Merge功能

pd.merge(dframe1,dframe2)

keyvalue_df1value_df2
0Z13
1Z33
2Y22

我們現(xiàn)在需要注意一點(diǎn),X僅僅是存在于dframe1的key,在dframe2中不存在,因此大家可以發(fā)現(xiàn),當(dāng)我們調(diào)用pd.merge的時(shí)候,會(huì)自動(dòng)默認(rèn)為inner join,
我們再換一種方式寫一下,大家就明白了:

pd.merge(dframe1,dframe2,on='key',how='inner')

keyvalue_df1value_df2
0Z13
1Z33
2Y22
大家可以發(fā)現(xiàn)結(jié)果是一樣的,看到這里,對(duì)sql熟悉的朋友們已經(jīng)有感覺了估計(jì),因?yàn)閷?shí)在是太像了,如果我們不通過on和how來指定想要merge的公有列或者方式,那么pd.merge就會(huì)自動(dòng)尋找到兩個(gè)DataFrame的相同列并自動(dòng)默認(rèn)為inner join,至此,估計(jì)大家也可以猜出其他幾種模式的merge啦

1.2 LeftMerge (左連接)

現(xiàn)在同樣的,讓我們看一下how='left'的情況,這是一個(gè)左連接
pd.merge(dframe1,dframe2,on='key',how='left')

keyvalue_df1value_df2
0X0NaN
1Z13.0
2Y22.0
3Z33.0
4X4NaN
5X5NaN

我們可以看到返回的是dframe1的所有key值對(duì)應(yīng)的結(jié)果,如果在dframe2中不存在,顯示為Nan空值

1.3 RightMerge (右連接)

右連接的原理和左連接正相反

pd.merge(dframe1,dframe2,on='key',how='right')

keyvalue_df1value_df2
0Z1.03
1Z3.03
2Y2.02
3QNaN1

這里Q只存在于drame2的key中

1.4 OuterMerge (全連接)

#Choosing the "outer" method selects the union of both keyspd.merge(dframe1,dframe2,on='key',how='outer')

keyvalue_df1value_df2
0X0.0NaN
1X4.0NaN
2X5.0NaN
3Z1.03.0
4Z3.03.0
5Y2.02.0
6QNaN1.0
 這里就是一個(gè)并集的形式啦,其實(shí)就是一個(gè)union的結(jié)果,會(huì)把key這一列在兩個(gè)Dataframe出現(xiàn)的所有值全部顯示出來,如果有空值顯示為Nan

1.5 MultipleKey Merge (基于多個(gè)key上的merge)

剛才我們都是僅僅實(shí)現(xiàn)的在一個(gè)key上的merge,當(dāng)然我們也可以實(shí)現(xiàn)基于多個(gè)keys的merge

# Dframe on leftdf_left = DataFrame({'key1': ['SF', 'SF', 'LA'],                  'key2': ['one', 'two', 'one'],                  'left_data': [10,20,30]})df_left

key1key2left_data
0SFone10
1SFtwo20
2LAone30
#Dframe on rightdf_right = DataFrame({'key1': ['SF', 'SF', 'LA', 'LA'],                   'key2': ['one', 'one', 'one', 'two'],                   'right_data': [40,50,60,70]})df_right

key1key2right_data
0SFone40
1SFone50
2LAone60
3LAtwo70
這是內(nèi)連接(交集)的結(jié)果
#Merge, Innerpd.merge(df_left, df_right, on=['key1', 'key2'])

key1key2left_dataright_data
0SFone1040
1SFone1050
2LAone3060
這是外連接(并集)的結(jié)果
#Merge, Outerpd.merge(df_left, df_right, on=['key1', 'key2'],how='outer')

key1key2left_dataright_data
0SFone10.040.0
1SFone10.050.0
2SFtwo20.0NaN
3LAone30.060.0
4LAtwoNaN70.0

這里還有一個(gè)地方非常有意思,大家可以發(fā)現(xiàn)現(xiàn)在df_left,df_right作為key的兩列分別是key1和key2,它們的名字是相同的,剛剛我們是通過制定on=['key1', 'key2'],那如果我們只指定一列會(huì)怎么樣呢?

pd.merge(df_left,df_right,on='key1')

key1key2_xleft_datakey2_yright_data
0SFone10one40
1SFone10one50
2SFtwo20one40
3SFtwo20one50
4LAone30one60
5LAone30two70

大家可以看到pandas自動(dòng)把key2這一列拆分成了key2_x和key2_y,都會(huì)顯示在最后的merge結(jié)果里,如果我們想要給這兩列重新命名,也是很容易的:

# We can also specify what the suffix becomespd.merge(df_left,df_right, on='key1',suffixes=('_lefty','_righty'))

key1key2_leftyleft_datakey2_rightyright_data
0SFone10one40
1SFone10one50
2SFtwo20one40
3SFtwo20one50
4LAone30one60
5LAone30two70

像這樣,我們可以通過suffixes參數(shù)來指定拆分的列的名字。

1.6 Merge on Index (基于index上的merge)

我們還可以實(shí)現(xiàn)幾個(gè)Dataframe基于Index的merge,還是老樣子,先讓我們創(chuàng)建兩個(gè)Dataframe
df_left = DataFrame({'key': ['X','Y','Z','X','Y'],                  'data': range(5)})df_right = DataFrame({'group_data': [10, 20]}, index=['X', 'Y'])
df_left

keydata
0X0
1Y1
2Z2
3X3
4Y4
df_right

group_data
X10
Y20

好了,現(xiàn)在我們想要實(shí)現(xiàn)兩個(gè)Dataframe的merge,但是條件是通過df_left的Key和df_right的Index

pd.merge(df_left,df_right,left_on='key',right_index=True)

keydatagroup_data
0X010
3X310
1Y120
4Y420

這樣我們也可以得到結(jié)果。

# We can also get a union by using outerpd.merge(df_left,df_right,left_on='key',right_index=True,how='outer')

keydatagroup_data
0X010.0
3X310.0
1Y120.0
4Y420.0
2Z2NaN

其他的merge方式就類似啦,這里就不一一說了,只是舉一個(gè)outer join的例子

# 通過outer實(shí)現(xiàn)外連接,union并集pd.merge(df_left,df_right,left_on='key',right_index=True,how='outer')

keydatagroup_data
0X010.0
3X310.0
1Y120.0
4Y420.0
2Z2NaN
我們也可以嘗試一些有意思的merge,比如,如果一個(gè)dataframe的index是多層嵌套的情況:
df_left_hr = DataFrame({'key1': ['SF','SF','SF','LA','LA'],                   'key2': [10, 20, 30, 20, 30],                   'data_set': np.arange(5.)})df_right_hr = DataFrame(np.arange(10).reshape((5, 2)),                   index=[['LA','LA','SF','SF','SF'],                          [20, 10, 10, 10, 20]],                   columns=['col_1', 'col_2'])
df_left_hr

key1key2data_set
0SF100.0
1SF201.0
2SF302.0
3LA203.0
4LA304.0
df_right_hr


col_1col_2
LA2001
1023
SF1045
1067
2089

現(xiàn)在我們穿建了兩個(gè)Dataframe 分別是df_left_hr和df_right_hr(Index兩層),如果我們想通過使用df_left_hr的key1,key2 及df_right_hr的Index作為merge
的列,也是沒有問題的

# Now we can merge the left by using keys and the right by its indexpd.merge(df_left_hr,df_right_hr,left_on=['key1','key2'],right_index=True)

key1key2data_setcol_1col_2
0SF100.045
0SF100.067
1SF201.089
3LA203.001

基本到這里,我已經(jīng)和大家分享了基礎(chǔ)的Merge有關(guān)的所有操作,如果你平時(shí)生活工作中經(jīng)常使用Excel執(zhí)行類似操作的話,可以學(xué)習(xí)一下Merge哈,它會(huì)大幅度
減輕你的工作強(qiáng)度的!

2.Join

現(xiàn)在我們可以接著來看join相關(guān)的操作,先讓我們看一個(gè)小例子

left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],                     'B': ['B0', 'B1', 'B2', 'B3']},                     index = ['K0', 'K1', 'K2', 'K3'])   right = pd.DataFrame({'C': ['C0', 'C1', 'C2', 'C3'],                       'D': ['D0', 'D1', 'D2', 'D3']},                       index = ['K0', 'K1', 'K2', 'K3']) 
left

AB
K0A0B0
K1A1B1
K2A2B2
K3A3B3
right

CD
K0C0D0
K1C1D1
K2C2D2
K3C3D3
left.join(right)

ABCD
K0A0B0C0D0
K1A1B1C1D1
K2A2B2C2D2
K3A3B3C3D3

其實(shí)通過這一個(gè)小例子大家也就明白了,join無非就是合并,默認(rèn)是橫向,還有一個(gè)點(diǎn)需要注意的是,我們其實(shí)可以通過join實(shí)現(xiàn)和merge一樣的效果,但是為了
避免混淆,我不會(huì)多舉其他的例子了,因?yàn)槲覀€(gè)人認(rèn)為一般情況下還是用merge函數(shù)好一些

3. Concat

為了更加全面徹底地了解Concat函數(shù),大家可以先從一維的Numpy Array開始,首先讓我們簡單的創(chuàng)建一個(gè)矩陣:

# Create a matrix arr1 = np.arange(9).reshape((3,3))arr1
array([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])

接著讓我們通過concatenate函數(shù)進(jìn)行橫向拼接:

np.concatenate([arr1,arr1],axis=1)
array([[0, 1, 2, 0, 1, 2],       [3, 4, 5, 3, 4, 5],       [6, 7, 8, 6, 7, 8]])

再讓我們進(jìn)行縱向拼接:

# Let's see other axis optionsnp.concatenate([arr1,arr1],axis=0)
array([[0, 1, 2],       [3, 4, 5],       [6, 7, 8],       [0, 1, 2],       [3, 4, 5],       [6, 7, 8]])

有了基礎(chǔ)的印象之后,現(xiàn)在讓我們看看在pandas中是如何操作的:

# Lets create two Series with no overlapser1 =  Series([0,1,2],index=['T','U','V'])ser2 = Series([3,4],index=['X','Y'])#Now let use concat (default is axis=0)pd.concat([ser1,ser2])
T    0U    1V    2X    3Y    4dtype: int64

在上面的例子中,我們分別創(chuàng)建了兩個(gè)沒有重復(fù)Index的Series,然后用concat默認(rèn)的把它們合并在一起,這時(shí)生成的依然是Series類型,如果我們把a(bǔ)xis換成1,那生成的就是Dataframe,像下面一樣

pd.concat([ser1,ser2],axis=1,sort =True)  # sort=Ture是默認(rèn)的,pandas總是默認(rèn)index排序

01
T0.0NaN
U1.0NaN
V2.0NaN
XNaN3.0
YNaN4.0

我們還可以指定在哪些index上進(jìn)行concat:

pd.concat([ser1,ser2],axis=1,join_axes=[['U','V','Y']])

01
U1.0NaN
V2.0NaN
YNaN4.0

也可以給不同組的index加一層標(biāo)簽

pd.concat([ser1,ser2],keys=['cat1','cat2'])
cat1  T    0      U    1      V    2cat2  X    3      Y    4dtype: int64

如果把a(bǔ)xis換成是1,那么keys就會(huì)變成column的名字:

pd.concat([ser1,ser2],axis=1,keys=['cat1','cat2'],sort=True)

cat1cat2
T0.0NaN
U1.0NaN
V2.0NaN
XNaN3.0
YNaN4.0

如果是兩個(gè)現(xiàn)成的dataframe直接進(jìn)行concat也是一樣:

dframe1 = DataFrame(np.random.randn(4,3), columns=['X', 'Y', 'Z'])dframe2 = DataFrame(np.random.randn(3, 3), columns=['Y', 'Q', 'X'])
dframe1

XYZ
01.119976-0.8539600.027451
1-0.5368310.982092-0.157650
2-0.219322-1.4898091.607735
30.767249-1.6619120.038837
dframe2

YQX
0-0.0355600.875282-1.630508
1-0.4394840.0962471.335693
20.7462990.5686841.197015
#如果沒有對(duì)應(yīng)的值,默認(rèn)為NaN, 空值pd.concat([dframe1,dframe2],sort=True)

QXYZ
0NaN1.119976-0.8539600.027451
1NaN-0.5368310.982092-0.157650
2NaN-0.219322-1.4898091.607735
3NaN0.767249-1.6619120.038837
00.875282-1.630508-0.035560NaN
10.0962471.335693-0.439484NaN
20.5686841.1970150.746299NaN

4. 源碼及Github地址

今天我為大家主要總結(jié)了pandas中非常常見的三種方法:

  • merge

  • concat

  • join

大家可以根據(jù)自己的實(shí)際需要來決定使用哪一種

我把這一期的ipynb文件和py文件放到了Github上,大家如果想要下載可以點(diǎn)擊下面的鏈接:

這一期就到這里啦,希望大家能夠繼續(xù)支持我,完結(jié),撒花

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Pandas數(shù)據(jù)合并
Python數(shù)據(jù)分析
在Pandas中DataFrame數(shù)據(jù)合并,連接(concat,merge,join)的實(shí)例
pandas中concat用法
python 數(shù)據(jù)清洗之?dāng)?shù)據(jù)合并、轉(zhuǎn)換、過濾、排序
Python 數(shù)據(jù)處理庫 pandas 進(jìn)階教程
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服