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

歡迎訪問 生活随笔!

生活随笔

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

python

python科学计算笔记(十三)pandas的merge、concat合并数据集

發布時間:2024/1/23 python 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python科学计算笔记(十三)pandas的merge、concat合并数据集 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本篇博客主要介紹:

合并數據集:.merge()、.concat()等方法,類似于SQL或其他關系型數據庫的連接操作。

合并數據集

1) merge 函數參數

參數說明
left參與合并的左側DataFrame
right參與合并的右側DataFrame
how連接方式:‘inner’(默認);還有,‘outer’、‘left’、‘right’
on用于連接的列名,必須同時存在于左右兩個DataFrame對象中,如果位指定,則以left和right列名的交集作為連接鍵
left_on左側DataFarme中用作連接鍵的列
right_on右側DataFarme中用作連接鍵的列
left_index將左側的行索引用作其連接鍵
right_index將右側的行索引用作其連接鍵
sort根據連接鍵對合并后的數據進行排序,默認為True。有時在處理大數據集時,禁用該選項可獲得更好的性能
suffixes字符串值元組,用于追加到重疊列名的末尾,默認為(‘_x’,‘_y’).例如,左右兩個DataFrame對象都有‘data’,則結果中就會出現‘data_x’,‘data_y’
copy設置為False,可以在某些特殊情況下避免將數據復制到結果數據結構中。默認總是賦值

1、多對一的合并(一個表的連接鍵列有重復值,另一個表中的連接鍵沒有重復值)

import pandas as pd import numpy as npdf1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1': range(7)})df1 ?data1key0123456
0b
1b
2a
3c
4a
5a
6b
df2 = pd.DataFrame({'key':['a','b','d'],'data2':range(3)})df2 ?data2key012
0a
1b
2d
pd.merge(df1,df2)#默認情況 ?data1keydata2012345
0b1
1b1
6b1
2a0
4a0
5a0
df1.merge(df2) ?data1keydata2012345
0b1
1b1
6b1
2a0
4a0
5a0
df1.merge(df2,on = 'key',how = 'inner')#內連接,取交集 ?data1keydata2012345
0b1
1b1
6b1
2a0
4a0
5a0
df1.merge(df2,on = 'key',how = 'outer')#外鏈接,取并集,并用nan填充 ?data1keydata201234567
0.0b1.0
1.0b1.0
6.0b1.0
2.0a0.0
4.0a0.0
5.0a0.0
3.0cNaN
NaNd2.0
df1.merge(df2,on = 'key',how = 'left')#左連接,左側DataFrame取全部,右側DataFrame取部分 ?data1keydata20123456
0b1.0
1b1.0
2a0.0
3cNaN
4a0.0
5a0.0
6b1.0
df1.merge(df2,on = 'key',how = 'right')#右連接,右側DataFrame取全部,左側DataFrame取部分 ?data1keydata20123456
0.0b1
1.0b1
6.0b1
2.0a0
4.0a0
5.0a0
NaNd2

如果左右側DataFrame的連接鍵列名不一致,但是取值有重疊,可使用left_on、right_on來指定左右連接鍵

df3 = pd.DataFrame({'lkey':['b','b','a','c','a','a','b'],'data1': range(7)})df3 ?data1lkey0123456
0b
1b
2a
3c
4a
5a
6b
df4 = pd.DataFrame({'rkey':['a','b','d'],'data2':range(3)})df4 ?data2rkey012
0a
1b
2d
df3.merge(df4,left_on = 'lkey',right_on = 'rkey',how = 'inner') ?data1lkeydata2rkey012345
0b1b
1b1b
6b1b
2a0a
4a0a
5a0a

2、多對多的合并(一個表的連接鍵列有重復值,另一個表中的連接鍵有重復值)

df1 = pd.DataFrame({'key':['b','b','a','c','a','a','b'],'data1': range(7)})df1 ?data1key0123456
0b
1b
2a
3c
4a
5a
6b
df5 = pd.DataFrame({'key':['a','b','a','b','b'],'data2': range(5)}) df5 ?data2key01234
0a
1b
2a
3b
4b
df1.merge(df5) ?data1keydata201234567891011121314
0b1
0b3
0b4
1b1
1b3
1b4
6b1
6b3
6b4
2a0
2a2
4a0
4a2
5a0
5a2

合并小結

1)默認情況下,會將兩個表中相同列名作為連接鍵

2)多對多,會采用笛卡爾積形式鏈接(左表連接鍵有三個值‘1,3,5’,右表有兩個值‘2,3’,則會形成,(1,2)(1,3)(3,1),(3,2)。。。6種組合)

3)存在多個連接鍵的處理

left = pd.DataFrame({'key1':['foo','foo','bar'],'key2':['one','one','two'],'lval':[1,2,3]})right = pd.DataFrame({'key1':['foo','foo','bar','bar'],'key2':['one','one','one','two'],'rval':[4,5,6,7]}) left ?key1key2lval012
fooone1
fooone2
bartwo3
right ?key1key2rval0123
fooone4
fooone5
barone6
bartwo7
pd.merge(left,right,on = ['key1','key2'],how = 'outer') ?key1key2lvalrval012345
fooone1.04
fooone1.05
fooone2.04
fooone2.05
bartwo3.07
baroneNaN6

1)連接鍵是多對多關系,應執行笛卡爾積形式

2)多列應看連接鍵值對是否一致

4)對連接表中非連接列的重復列名的處理

pd.merge(left,right,on = 'key1') ?key1key2_xlvalkey2_yrval012345
fooone1one4
fooone1one5
fooone2one4
fooone2one5
bartwo3one6
bartwo3two7
pd.merge(left,right,on = 'key1',suffixes = ('_left','_right')) ?key1key2_leftlvalkey2_rightrval012345
fooone1one4
fooone1one5
fooone2one4
fooone2one5
bartwo3one6
bartwo3two7

2)索引上的合并

當連接鍵位于索引中時,成為索引上的合并,可以通過merge函數,傳入left_index、right_index來說明應該被索引的情況。

  • 一表中連接鍵是索引列、另一表連接鍵是非索引列
  • left1 = pd.DataFrame({'key':['a','b','a','a','b','c'],'value': range(6)}) left1 ?keyvalue012345
    a0
    b1
    a2
    a3
    b4
    c5
    right1 = pd.DataFrame({'group_val':[3.5,7]},index = ['a','b']) right1 ?group_valab
    3.5
    7.0
    pd.merge(left1,right1,left_on = 'key',right_index = True) ?keyvaluegroup_val02314
    a03.5
    a23.5
    a33.5
    b17.0
    b47.0

    有上可知,left_on、right_on是指定表中非索引列為連接鍵,left_index、right_index是指定表中索引列為連接鍵,兩者可以組合,是為了區分是否是索引列

  • 兩個表中的索引列都是連接鍵
  • left2 = pd.DataFrame(np.arange(6).reshape(3,2),index = ['a','b','e'],columns = ['0hio','nevada'])right2 = pd.DataFrame(np.arange(7,15).reshape(4,2),index = ['b','c','d','e'],columns = ['misso','ala'])left2 ?0hionevadaabe
    01
    23
    45
    right2 ?missoalabcde
    78
    910
    1112
    1314
    pd.merge(left2,right2,left_index = True,right_index = True,how = 'outer') ?0hionevadamissoalaabcde
    0.01.0NaNNaN
    2.03.07.08.0
    NaNNaN9.010.0
    NaNNaN11.012.0
    4.05.013.014.0

    3)軸向連接

    在這里展示一種新的連接方法,對應于numpy的concatenate函數,pandas有concat函數

    #numpy arr =np.arange(12).reshape(3,4) arr array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]]) np.concatenate([arr,arr],axis = 1)#橫軸連接塊 array([[ 0, 1, 2, 3, 0, 1, 2, 3],[ 4, 5, 6, 7, 4, 5, 6, 7],[ 8, 9, 10, 11, 8, 9, 10, 11]])

    concat函數參數表格

    參數說明
    objs參與連接的列表或字典,且列表或字典里的對象是pandas數據類型,唯一必須給定的參數
    axis=0指明連接的軸向,0是縱軸,1是橫軸,默認是0
    join‘inner’(交集),‘outer’(并集),默認是‘outer’指明軸向索引的索引是交集還是并集
    join_axis指明用于其他n-1條軸的索引(層次化索引,某個軸向有多個索引),不執行交并集
    keys與連接對象有關的值,用于形成連接軸向上的層次化索引(外層索引),可以是任意值的列表或數組、元組數據、數組列表(如果將levels設置成多級數組的話)
    levels指定用作層次化索引各級別(內層索引)上的索引,如果設置keys的話
    names用于創建分層級別的名稱,如果設置keys或levels的話
    verify_integrity檢查結果對象新軸上的重復情況,如果發橫則引發異常,默認False,允許重復
    ignore_index不保留連接軸上的索引,產生一組新索引range(total_length)
    s1 = pd.Series([0,1,2],index = ['a','b','c'])s2 = pd.Series([2,3,4],index = ['c','f','e'])s3 = pd.Series([4,5,6],index = ['c','f','g']) pd.concat([s1,s2,s3])#默認并集、縱向連接 a 0 b 1 c 2 c 2 f 3 e 4 c 4 f 5 g 6 dtype: int64 pd.concat([s1,s2,s3],ignore_index = True)#生成縱軸上的并集,索引會自動生成新的一列 0 0 1 1 2 2 3 2 4 3 5 4 6 4 7 5 8 6 dtype: int64 pd.concat([s1,s2,s3],axis = 1,join = 'inner')#縱向取交集,注意該方法對對象表中有重復索引時失效 ?012c
    224
    pd.concat([s1,s2,s3],axis = 1,join = 'outer')#橫向索引取并集,縱向索引取交集,注意該方法對對象表中有重復索引時失效 ?012abcefg
    0.0NaNNaN
    1.0NaNNaN
    2.02.04.0
    NaN4.0NaN
    NaN3.05.0
    NaNNaN6.0

    concat函數小結

    1)縱向連接,ignore_index = False ,可能生成重復的索引

    2)橫向連接時,對象索引不能重復

    4)合并重疊數據

    適用范圍:

    1)當兩個對象的索引有部分或全部重疊時

    2)用參數對象中的數據為調用者對象的缺失數據‘打補丁’

    a = pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index = ['a','b','c','d','e','f'])b = pd.Series(np.arange(len(a)),index = ['a','b','c','d','e','f']) a a NaN b 2.5 c NaN d 3.5 e 4.5 f NaN dtype: float64 b a 0 b 1 c 2 d 3 e 4 f 5 dtype: int32 a.combine_first(b)#利用b填補了a的空值 a 0.0 b 2.5 c 2.0 d 3.5 e 4.5 f 5.0 dtype: float64 a = pd.Series([np.nan,2.5,np.nan,3.5,4.5,np.nan],index = ['g','b','c','d','e','f']) a.combine_first(b)#部分索引重疊 a 0.0 b 2.5 c 2.0 d 3.5 e 4.5 f 5.0 g NaN dtype: float64

    小結

    本篇博客主要講述了一下內容:

    1) merge函數合并數據集

    2)concat函數合并數據集

    3)combine_first函數,含有重疊索引的缺失值填補

    總結

    以上是生活随笔為你收集整理的python科学计算笔记(十三)pandas的merge、concat合并数据集的全部內容,希望文章能夠幫你解決所遇到的問題。

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