pandas:merge和DataFrame.join的用法區別
merge
- pandas.merge
- DataFrame.merge 這兩個方法的用法一樣。
join
- DataFrame.join
- Index.join
- Series.str.join 。簡單的字符串連接。
- 3個join用法不一樣
Pandas.concat()只是簡單的合並表
DataFrame.join(self, other, on = None, how="left", lsuffix="", rsufix="")-> DataFrame
連接2個/多個DataFrame。對於簡單的索引合並,你還可以向join傳入一組DataFrame。
left2.join([right2, another])
可以通過columns和另一個DataFrame的column或index連接。
⚠️。如果2個DataFrame有相同名字的普通列,需要為2個表加后綴。
關於on的用法:
- 如果沒有使用on參數,join函數判斷能否index-on-index, 如果2個表有重復列名,需要加上后綴。
- 如果使用了on參數,on指定的列名或index name去連接other表的index 。
DataFrame.merge()
pd.merge(left, right, how="inner", left_on=None, right_on=None, left_index=False, right_index=False)
和join方法類似。但不一樣:主要區別在關聯方法上:
- join方法
- 默認使用index-on-index,
- 如果有on參數,則用on參數指定的列名/index名來連接other的index。
- merge方法
- 默認,自動把2個表中有相同列名的列(重疊列)作為主鍵列。
- 最好是明確指定on參數,此時列名/index name必須同時在2個表內出現。
- 或者使用left_on和right_on參數作為連接的key。明確指定2個表要關聯的列名/index name
- 或者使用left_index和right_index參數。
總結,都要理解,之后使用哪個就隨心了。
案例
如果有相同的列名,則未使用on,和使用on參數的例子:
df1 = pd.DataFrame({'key': ['b', 'b', 'a', 'c', 'a', 'a', 'b'], 'data1': range(7)}) df2 = pd.DataFrame({'key': list("abc"), "data2": range(3)}) pd.merge(df1, df2) #或者明確使用on參數: pd.merge(df1, df2, on='key')
如果沒有相同列名,則使用left_on和right_on的例子:
df3 = pd.DataFrame({'lkey': ['b', 'b', 'a', 'c', 'a', 'a', 'b'],'data1': range(7)}) df4 = pd.DataFrame({'rkey': ['a', 'b', 'd'], 'data2': range(3)}) pd.merge(df3, df4, left_on="lkey", right_on="rkey") # lkey data1 rkey data2 0 b 0 b 1 1 b 1 b 1 2 b 6 b 1 3 a 2 a 0 4 a 4 a 0 5 a 5 a 0
⚠️默認how="inner"即內連接,所以df3中的c和df4中的d行沒有選中。how的參數有:left, right, outer, inner。
上面兩個例子,表的行關系是:多對1。如果是多對多,則發生笛卡爾積運算。
要根據多個鍵進行合並,傳入一個由列名組成的列表即可:
right = pd.DataFrame({'key1': ['foo', 'foo', 'bar', 'bar'], 'key2': ['one', 'one', 'one', 'two'], 'rval': [4, 5, 6, 7]}) left = pd.DataFrame({'key1': ['foo', 'foo', 'bar'], 'key2': ['one', 'two', 'one'], 'lval': [1, 2, 3]}) pd.merge(left, right, on=['key1', 'key2'])
merge函數自帶的參數suffixes,可以自動處理重復的列名。也可以自定義后綴suffixes=('_left', '_r ight'))