merge
merge 函式透過一個或多個鍵將資料集的行連線起來。
場景:針對同一個主鍵存在的兩張包含不同特徵的表,透過主鍵的連結,將兩張表進行合併。合併之後,兩張表的行數不增加,列數是兩張表的列數之和。
def merge(left, right, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=False, suffixes=('_x', '_y'), copy=True, indicator=False, validate=None):
引數 | 描述 |
---|---|
how | 資料融合的方法,從在不重合的鍵,方式(inner、outer、left、right) |
on | 用來對齊的列名,一定要保證左表和右表存在相同的列名。 |
left_on | 左表對齊的列,可以是列名。也可以是DataFrame同長度的arrays |
right_on | 右表對齊的列,可以是列名。 |
left_index | 將左表的index用作連線鍵 |
right_index | 將右表的index用作連線鍵 |
suffixes | 左右物件中存在重名列,結果區分的方式,字尾名。 |
copy | 預設:True。將資料複製到資料結構中,設定為False提高效能。 |
特性示例(1)
預設:以重疊的列名當作連線鍵
df1 = pd.DataFrame({'key': ['one', 'two', 'two'], 'data1': np.arange(3)}) df2 = pd.DataFrame({'key': ['one', 'three', 'three'], 'data2': np.arange(3)}) df3 = pd.merge(df1, df2) print(df1) print(df2) print(df3)
key data1 0 one 0 1 two 1 2 two 2 key data2 0 one 0 1 three 1 2 three 2 key data1 data2 0 one 0 0
特性示例(2)
預設:做inner連線,取key的交集
連線方式還有left right outer
df1 = pd.DataFrame({'key': ['one', 'two', 'two'], 'data1': np.arange(3)}) df2 = pd.DataFrame({'key': ['one', 'three', 'three'], 'data2': np.arange(3)}) df3 = pd.merge(df1, df2) df4 = pd.merge(df1, df2, how='left') print(df3) print(df4)
key data1 data2 0 one 0 0 key data1 data2 0 one 0 0.0 1 two 1 NaN 2 two 2 NaN
特性示例(3)
多鍵連線時將連線鍵做成列表傳入。
on預設是兩者同時存在的列
df1 = pd.DataFrame({'key': ['one', 'two', 'two'], 'value': ['a', 'b', 'c'], 'data1': np.arange(3)}) df2 = pd.DataFrame({'key': ['one', 'two', 'three'], 'value': ['a', 'c', 'c'], 'data2': np.arange(3)}) df5 = pd.merge(df1, df2) df6 = pd.merge(df1, df2, on=['key', 'value'], how='outer') print(df5) print(df6)
key value data1 data2 0 one a 0 0 1 two c 2 1 key value data1 data2 0 one a 0.0 0.0 1 two b 1.0 NaN 2 two c 2.0 1.0 3 three c NaN 2.0
特性示例(4)
兩個物件的列名不同,需要分別制定。
df7 = pd.merge(df1, df2, left_on=['key1','data1'], right_on=['key2','data2'], how='outer') print(df7)
key1 value_x data1 key2 value_y data2 0 one a 0.0 one a 0.0 1 two b 1.0 two c 1.0 2 two c 2.0 NaN NaN NaN 3 NaN NaN NaN three c 2.0
join
join方法將兩個DataFrame中不同的列索引合併成為一個DataFrame
引數的意義與merge基本相同,只是join方法預設左外連線how=left
def join(self, other, on=None, how='left', lsuffix='', rsuffix='', sort=False):
示例
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A1'], 'B': ['B0', 'B1', 'B2']}, index=['K0', 'K1', 'K2']) df2 = pd.DataFrame({'C': ['C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2']}, index=['K0', 'K1', 'K3']) df3 = df1.join(df2) df4 = df1.join(df2, how='outer') df5 = df1.join(df2, how='inner') print(df3) print(df4) print(df5)
A B C D K0 A0 B0 C1 D0 K1 A1 B1 C2 D1 K2 A1 B2 NaN NaN A B C D K0 A0 B0 C1 D0 K1 A1 B1 C2 D1 K2 A1 B2 NaN NaN K3 NaN NaN C3 D2 A B C D K0 A0 B0 C1 D0 K1 A1 B1 C2 D1
concat
制定按某個軸進行連線(可橫向可縱向),也可以指定連線方法。
def concat(objs, axis=0, join='outer', join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, sort=None, copy=True):
屬性 | 描述 |
---|---|
objs | 合併的物件集合。可以是Series、DataFrame |
axis | 合併方法。預設0,表示縱向,1橫向 |
join | 預設outer並集,inner交集。只有這兩種 |
join_axes | 按哪些物件的索引儲存 |
ignore_index | 預設Fasle忽略。是否忽略原index |
keys | 為原始DataFrame新增一個鍵,預設無 |
示例(1)
s1 = pd.Series(['a', 'b']) s2 = pd.Series(['c', 'd']) s3 = pd.concat([s1, s2]) s4 = pd.concat([s1, s2], ignore_index=True) print(s3) print(s4)
0 a 1 b dtype: object 0 c 1 d dtype: object 0 a 1 b 0 c 1 d dtype: object 0 a 1 b 2 c 3 d dtype: object
示例(2)
df1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['A', 0]) df2 = pd.DataFrame([['a', 1], ['b', 2]], columns=['B', 0]) df3 = pd.concat([df1, df2], join='inner') print(df3)
0 0 1 1 2 0 1 1 2
示例(3)
df1 = pd.DataFrame([['a', 1], ['b', 2]], columns=['A', 0]) df2 = pd.DataFrame([['a', 1], ['b', 2]], columns=['B', 0]) df3 = pd.concat([df1, df2], axis=1, join_axes=[df1.index]) print(df3)
A 0 B 0 0 a 1 a 1 1 b 2 b 2
append
橫向和縱向同時擴充,不考慮columns和index
df1 = pd.DataFrame({'A': ['A0', 'A1', 'A1'], 'B': ['B0', 'B1', 'B2']}, index=['K0', 'K1', 'K2']) s2 = pd.Series(['X0','X1'], index=['A','B']) result = df1.append(s2, ignore_index=True) print(result)
A B K0 A0 B0 K1 A1 B1 K2 A1 B2 A B 0 A0 B0 1 A1 B1 2 A1 B2 3 X0 X1
彙總
concat:可以沿一條軸將多個物件連線到一起
merge:可以根據一個或多個鍵將不同的DataFrame中的行連線起來。
join:inner是交集,outer是並集。
[kyec555 ] DataFrame 資料合併實現(merge,join,concat)已經有229次圍觀