日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Python?Pandas實現DataFrame合并的圖文教程_python

作者:笑?癮 ? 更新時間: 2022-09-18 編程語言

一、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:要merge的dataframe或者有name的Series
how:join類型,'left', 'right', 'outer', 'inner'
on:join的key,left和right都需要有這個key
left_on:left的df或者series的key
right_on:right的df或者seires的key
left_index,right_index:使用index而不是普通的column做join
suffixes:兩個元素的后綴,如果列有重名,自動添加后綴,默認是('_x', '_y')

二、以關鍵列來合并兩個dataframe

可以看到只有left和right的key1=y的行保留了下來,即默認合并后只保留有共同列項并且值相等行(即交集)。

本例中left和right的k1=y分別有2個,最終構成了2*2=4行

import pandas as pd
left = pd.DataFrame({'A': ['a0', 'a1', 'a2', 'a3'],
                     'B': ['b0', 'b1', 'b2', 'b3'],
                     'k1': ['x', 'x', 'y', 'y']})
right = pd.DataFrame({'C': ['c1', 'c2', 'c3', 'c4'],
                      'D': ['d1', 'd2', 'd3', 'd4'],
                      'k1': ['y', 'y', 'z', 'z']})

left

left

right

pd.merge(left, right, on=‘k1’)

三、理解merge時數量的對齊關系

one-to-one:一對一關系,關聯的key都是唯一的
?? ?比如(學號,姓名) merge (學號,年齡)
?? ?結果條數為:1*1
one-to-many:一對多關系,左邊唯一key,右邊不唯一key
?? ?比如(學號,姓名) merge (學號,[語文成績、數學成績、英語成績])
?? ?結果條數為:1*N
many-to-many:多對多關系,左邊右邊都不是唯一的
?? ?比如(學號,[語文成績、數學成績、英語成績]) merge (學號,[籃球、足球、乒乓球])
?? ?結果條數為:M*N

1、one-to-one 一對一關系的merge

left = pd.DataFrame({'sno': [11, 12, 13, 14],
                      'name': ['name_a', 'name_b', 'name_c', 'name_d']
                    })
right = pd.DataFrame({'sno': [11, 12, 13, 14],
                      'age': ['21', '22', '23', '24']
                    })

left

right

# 一對一關系,結果中有4條
pd.merge(left, right, on='sno')

2、one-to-many 一對多關系的merge

注意:數據會被復制

left = pd.DataFrame({'sno': [11, 12, 13, 14],
                      'name': ['name_a', 'name_b', 'name_c', 'name_d']
                    })
right = pd.DataFrame({'sno': [11, 11, 11, 12, 12, 13],
                       'grade': ['語文88', '數學90', '英語75','語文66', '數學55', '英語29']
                     })

left

right

# 數目以多的一邊為準
pd.merge(left, right, on='sno')

3、many-to-many 多對多關系的merge

注意:結果數量會出現乘法

left = pd.DataFrame({'sno': [11, 11, 12, 12,12],
                      '愛好': ['籃球', '羽毛球', '乒乓球', '籃球', "足球"]
                    })
right = pd.DataFrame({'sno': [11, 11, 11, 12, 12, 13],
                       'grade': ['語文88', '數學90', '英語75','語文66', '數學55', '英語29']
                     })

left

right

pd.merge(left, right, on=‘sno’)

四、理解left join、right join、inner join、outer join的區別

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K4', 'K5'],
                      'C': ['C0', 'C1', 'C4', 'C5'],
                      'D': ['D0', 'D1', 'D4', 'D5']})

left

right

1、inner join,默認

左邊和右邊的key都有,才會出現在結果里

pd.merge(left, right, how='inner')

2、left join

左邊的都會出現在結果里,右邊的如果無法匹配則為Null

pd.merge(left, right, how='left')

3、 right join

右邊的都會出現在結果里,左邊的如果無法匹配則為Null

pd.merge(left, right, how='right')

4、 outer join

左邊、右邊的都會出現在結果里,如果無法匹配則為Null

pd.merge(left, right, how='outer')

五、如果出現非Key的字段重名怎么辦

left = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
                      'A': ['A0', 'A1', 'A2', 'A3'],
                      'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key': ['K0', 'K1', 'K4', 'K5'],
                      'A': ['A10', 'A11', 'A12', 'A13'],
                      'D': ['D0', 'D1', 'D4', 'D5']})

left

right

pd.merge(left, right, on='key')

pd.merge(left, right, on='key', suffixes=('_left', '_right'))

總結

原文鏈接:https://blog.csdn.net/weixin_47661174/article/details/124697842

欄目分類
最近更新