Pandas —— (6)多個DataFrame的合並、連接、去重、替換


@


Pandas具有全功能的,高性能內存中連接操作,與SQL等關系數據庫非常相似

  • 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)
  • pd.concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False,keys=None, levels=None, names=None, verify_integrity=False,copy=True)
  • .replace()
  • .duplicated()

一、merge合並 → 類似excel的vlookup

1.1 參數on → 參考鍵

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

df1
在這里插入圖片描述
df2
在這里插入圖片描述

# left:第一個df
# right:第二個df
# on:參考鍵,參考鍵相同的行會合並
df = pd.merge(df1, df2, on='key')

在這里插入圖片描述

df3 = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                    'key2': ['K0', 'K1', 'K0', 'K1'],
                    'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3']})
df4 = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                    'key2': ['K0', 'K0', 'K0', 'K0'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']})
# 多個鏈接鍵,必須key1和key2都相同才合並 
print(pd.merge(df3, df4, on=['key1','key2']))

在這里插入圖片描述
注意這里觸發了對齊

1.2 參數how → 合並方式

# inner:默認,取交集
pd.merge(df3, df4,on=['key1','key2'], how = 'inner')

# outer:取並集,數據缺失范圍NaN
print(pd.merge(df3, df4, on=['key1','key2'], how = 'outer'))  

# left:按照df3的on參數為參考合並,數據缺失范圍NaN
print(pd.merge(df3, df4, on=['key1','key2'], how = 'left')) 

# right:按照df4的on參數為參考合並,數據缺失范圍NaN
print(pd.merge(df3, df4, on=['key1','key2'], how = 'right'))  

1.3 參數 left_on, right_on, left_index, right_index → 當鍵不為一個列時,可以單獨設置左鍵與右鍵

df1 = pd.DataFrame({'lkey':list('bbacaab'),
                   'data1':range(7)})
df2 = pd.DataFrame({'rkey':list('abd'),
                   'date2':range(3)})
print(pd.merge(df1, df2, left_on='lkey', right_on='rkey'))
print('------')
# df1以‘lkey’為鍵,df2以‘rkey’為鍵

df1 = pd.DataFrame({'key':list('abcdfeg'),
                   'data1':range(7)})
df2 = pd.DataFrame({'date2':range(100,105)},
                  index = list('abcde'))
print(pd.merge(df1, df2, left_on='key', right_index=True))
# df1以‘key’為鍵,df2以index為鍵
# left_index:為True時,第一個df以index為鍵,默認False
# right_index:為True時,第二個df以index為鍵,默認False

# 所以left_on, right_on, left_index, right_index可以相互組合:
# left_on + right_on, left_on + right_index, left_index + right_on, left_index + right_index

二、concat連接

s1 = pd.Series([1,2,3])
s2 = pd.Series([2,3,4])
print(pd.concat([s1,s2]))
print('-----')
# 默認axis=0,行+行

s3 = pd.Series([1,2,3],index = ['a','c','h'])
s4 = pd.Series([2,3,4],index = ['b','e','d'])
print(pd.concat([s3,s4]).sort_index())
print(pd.concat([s3,s4], axis=1))
print('-----')
# axis=1,列+列,成為一個Dataframe
# 重設index為默認的0~n
s_new = pd.concat([s3,s4], axis=1)
s_new.reset_index(inplace=True, drop=False)# drop 是否把index列丟棄
s_new

三、duplicated去重

方法1

s = pd.Series([1,1,1,1,2,2,2,3,4,5,5,5,5])
print(s.duplicated())# 判斷是否重復
print(s[s.duplicated() == False])# 通過布爾判斷,得到不重復的值

方法2

# drop.duplicates移除重復
# inplace參數:是否替換原值,默認False
s_re = s.drop_duplicates()

方法3

sq = s.unique()

四、replace替換

s = pd.Series(list('ascaazsd'))
print(s.replace('a', np.nan))
print(s.replace(['a','s'] ,np.nan))
print(s.replace({'a':'hello world!','s':123}))
# 可一次性替換一個值或多個值
# 可傳入列表或字典

打賞

碼字不易,如果對您有幫助,就打賞一下吧O(∩_∩)O


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM