日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python数据分析pandas之数据拼接与连接

發布時間:2024/9/27 python 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python数据分析pandas之数据拼接与连接 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python數據分析pandas之數據拼接與連接

數據拼接處理

數據拼接處理指的是numpy、pandas里對數據的拼接、連接、合并等多種方法的概稱。有時我們處理的數據會分很多步驟,而中間或者最終的結果可能是由多個數據框、多維數組通過拼接等方式組裝而來。本章節主要介紹如何使用拼接、連接、合并的方法處理numpy和pandas類型的數據。

數據拼接

數據拼接主要是對行(列)名相同的元素進行拼接,行拼接則會使行變多,而列不變,而列拼接則是列變多,而行固定。

Numpy數組axis=0行拼接

# 1 通過np的concatenate方法對數組進行拼接,拼接時不會改變數組的維數。 x=[9,8,7] y=[6,5,4] z=[3,2,1] data=np.concatenate([x,y,z],axis=0) print(data)#如果我們指定axis=1,則會報錯,錯誤信息見下: numpy.AxisError: axis 1 is out of bounds for array of dimension 1# 2 拼接時如果指定的axis=0,則是行拼接,即行變多,而列保持不變;而axis=1,則是列拼接,即列變多,而行保持不變。這里不變是相對第一個數組。 arr1=np.array([[1,2,3],[4,5,3],[11,12,13]]) arr2=np.array([[6,7,8],[21,22,23]]) #這里行可以少于第一個數組,但列要相同。 print(np.concatenate([arr1,arr2],axis=0)) #結果 [[ 1 2 3] [ 4 5 3] [11 12 13] [ 6 7 8] [21 22 23]]

Numpy數組axis=1列拼接

# 1 按照行方向拼接,列增寬。 arr1=np.array([[1,2,3],[4,5,3],[11,12,13]]) arr2=np.array([[6,7,8],[21,22,23],[34,78,67]]) #行和列都要跟第一個數組一致。 print(np.concatenate([arr1,arr2],axis=1)) #結果 [[ 1 2 3 6 7 8] [ 4 5 3 21 22 23] [11 12 13 34 78 67]]

Pandas axis=0行拼接

Pandas的拼接和numpy類似。

# axis=0 行拼接,即列保持不變,行變多。 import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["劉二",48],["宋五",32]],columns=[ 'name','age',],index=['no_004','no_005']) print(pd.concat([df1,df2],axis=0)) #結果name age no_001 張三 28 no_002 李四 32 no_003 王二 19 no_004 劉二 48 no_005 宋五 32

Pandas axis=1列拼接

# axis=1列拼接,即行保持不變,列變多。在原有的姓名、年齡后追加等級列。 import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([['A'],['B'],['C']],columns=['level'],index=['no_001','no_002','no_003']) print(pd.concat([df1,df2],axis=1)) #結果name age level no_001 張三 28 A no_002 李四 32 B no_003 王二 19 C

Pandas重復索引拼接

# 特別的,如果拼接時索引出現重復,pandas會同時顯示兩個一樣的索引。 import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["劉二",48],["宋五",32]],columns=[ 'name','age',],index=['no_001','no_002']) print(pd.concat([df1,df2],axis=0)) print(pd.concat([df1,df2],axis=0,ignore_index=True)) #結果name age no_001 張三 28 no_002 李四 32 no_003 王二 19 no_001 劉二 48 no_002 宋五 32

Pandas忽略索引拼接

# 索引重復時通過ignore_index=True參數忽略索引 import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["劉二",48],["宋五",32]],columns=[ 'name','age',],index=['no_001','no_002']) print(pd.concat([df1,df2],axis=0,ignore_index=True))name age 0 張三 28 1 李四 32 2 王二 19 3 劉二 48 4 宋五 32

Pandas 多層維索引拼接

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["劉二",48],["宋五",32]],columns=[ 'name','age',],index=['no_001','no_002']) print(pd.concat([df1,df2],axis=0,keys=['one','two'])) #結果name age one no_001 張三 28no_002 李四 32no_003 王二 19 two no_001 劉二 48no_002 宋五 32

Pandas 內連接方式拼接

#內連接方式(inner join)是對有相同的列做拼接,拼接時只通過相同的列名匹配。 import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["宋五",32,'B']],columns=[ 'name','age','level'],index=['no_001','no_002']) print(pd.concat([df1,df2],axis=0,join="inner")) #結果name age no_001 張三 28 no_002 李四 32 no_003 王二 19 no_001 李四 32 no_002 宋五 32

Pandas 外連接方式拼接

#外連接方式(outer join)是所有的列都參與拼接,期中列名不在主表的用NaN填充。import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["宋五",32,'B']],columns=[ 'name','age','level'],index=['no_001','no_002']) #這里因為有重復數據,所以加了個sort=True print(pd.concat([df1,df2],axis=0,join="outer",sort=True)) #結果age level name no_001 28 NaN 張三 no_002 32 NaN 李四 no_003 19 NaN 王二 no_001 32 A 李四 no_002 32 B 宋五

Pandas join_axes連接方式拼接

#通過join_axes參數指定輸出時的列名和順序 import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=[ 'name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["宋五",32,'B']],columns=[ 'name','age','level'],index=['no_001','no_002']) print(pd.concat([df1,df2],axis=0,join_axes=[df2.columns])) #結果name age level no_001 張三 28 NaN no_002 李四 32 NaN no_003 王二 19 NaN no_001 李四 32 A no_002 宋五 32 B

Pandas 追加方式拼接

# 通過append(追加)方式拼接,該方法是應用拼接的數據生成個新的對象而不是修改原有Pandas的數據。 import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32],["宋五",32]],columns=['name','age'],index=['no_001','no_002']) print(df1.append(df2)) #結果name age no_001 張三 28 no_002 李四 32 no_003 王二 19 no_001 李四 32 no_002 宋五 32

數據連接

數據連接主要是對行(列)名相同的元素進行關聯,用兩者列名相同的元素進行內容匹配。

Merge 內連接

Merge inner(內連接)方式時會按照兩個DataFrame有相同的列名和值去匹配,有記錄即返回。返回的列名不會出現重復。

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['name','age','level'],index=['no_004','no_005','no_006']) print(pd.merge(df1,df2,how='inner')) #print(pd.merge(df1,df2)) #等價于上式 #print(df1.merge(df2)) #等價于上式 #結果name age level 0 李四 32 A 1 王二 19 B

Merge 外連接

Merge outer(外連接)方式是會按照兩個DataFrame有相同的列名和值去匹配,匹配不上的用NaN填充。返回的列名不會出現重復。

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['name','age','level'],index=['no_004','no_005','no_006']) print(pd.merge(df1,df2,how='outer')) #print(df1.merge(df2,how='outer')) #等價于上式 #結果name age level 0 張三 28 NaN 1 李四 32 A 2 王二 19 B 3 王三 34 C

Merge 左外連接

Merge left(左連接)方式是按照兩個DataFrame有相同的列名和值去匹配,其中左邊的為主表(返回記錄同左表),匹配不上的用NaN填充。返回的列名不會出現重復。

同理right(右連接)與左連接類似。

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['name','age','level'],index=['no_004','no_005','no_006']) print(pd.merge(df1,df2,how='left')) # print(df1.merge(df2,how='left')) 等價于上式 print(pd.merge(df1,df2,how='right'))#結果name age level 0 張三 28 NaN 1 李四 32 Aname age level 0 李四 32 A 1 王二 19 B 2 王三 34 C

Merge 指定key連接

如果要連接的字段名稱不一樣,那么就需要用指定key的方式去連接。

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['title','year','level'],index=['no_004','no_005','no_006']) print(pd.merge(df1,df2,left_on=["name","age"],right_on=["title","year"])) #結果name age title year level 0 李四 32 李四 32 A 1 王二 19 王二 19 B

Merge 指定key刪除重復列連接

該方式在指定key連接的基礎上會刪除重復的列,即取連接里去重后的列名。

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['title','year','level'],index=['no_004','no_005','no_006']) print(pd.merge(df1,df2,left_on=["name","age"],right_on=["title","year"]).drop(["title","year"],axis=1)) #結果name age level 0 李四 32 A 1 王二 19 B

Merge 指定索引連接

該方式是通過索引進行數據的連接,參數為left_index。如果想刪除“重復”的列,接drop函數即可。見下例:

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19]],columns=['name','age',],index=['no_001','no_002','no_003']) df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C']],columns=['title','year','level'],index=['no_004','no_002','no_003']) print(pd.merge(df1,df2,left_index=True,right_index=True)) #指定要刪除的列 print(pd.merge(df1,df2,left_index=True,right_index=True).drop(["title","year"],axis=1)) #結果name age title year level no_002 李四 32 王二 19 B no_003 王二 19 王三 34 Cname age level no_002 李四 32 B no_003 王二 19 C注:1 left_index(right_index)可以和right_on(left_on)混(一起)用。

Join實現數據連接

Pandas實現了join方法來進行數據的連接,不過需要注意的是,這里默認是按照索引連連接。

import pandas as pd df1=pd.DataFrame([["張三",28],["李四",32],["王二",19],["王一",23]],columns=['name','age',],index=['no_001','no_002','no_003','no_004']) df2=pd.DataFrame([["李四",32,'A'],["王二",19,'B'],["王三",34,'C'],["劉七",35,'A']],columns=['name','age','level'],index=['no_001','no_002','no_003','no_006']) print(df1.join(df2,how="outer",rsuffix='_r')) print(df1.join(df2,how="left",rsuffix='_r')) print(df1.join(df2,how="inner",lsuffix='_l')) print(df1.join(df2,how="inner",rsuffix='_r').drop(["name_r","age_r"],axis=1))#結果name age name_r age_r level no_001 張三 28.0 李四 32.0 A no_002 李四 32.0 王二 19.0 B no_003 王二 19.0 王三 34.0 C no_004 王一 23.0 NaN NaN NaN no_006 NaN NaN 劉七 35.0 Aname age name_r age_r level no_001 張三 28 李四 32.0 A no_002 李四 32 王二 19.0 B no_003 王二 19 王三 34.0 C no_004 王一 23 NaN NaN NaNname_l age_l name age level no_001 張三 28 李四 32 A no_002 李四 32 王二 19 B no_003 王二 19 王三 34 Cname age level no_001 張三 28 A no_002 李四 32 B no_003 王二 19 C

總結

以上是生活随笔為你收集整理的Python数据分析pandas之数据拼接与连接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。