使用pandas的merge方法進行數(shù)據(jù)合并的時候,如果列名相同則可以省去列名的指定,pandas會進行自動的識別。但是如果兩組數(shù)據(jù)的列名不一致,不加任何參數(shù)直接進行默認的操作則會導致報錯。
例如有如下兩組數(shù)據(jù):
In [40]:df1
Out[40]:
data1 key1:
0 0 c
1 1 d
2 2 e
3 3 f
4 4 g
5 5 a
6 6 b
In [41]:df2
Out[41]:
data2 key2
0 0 a
1 1 c
2 2 d
嘗試進行數(shù)據(jù)合并,結果提示如下:
In [42]:pd.merge(df1,df2)
---------------------------------------------------------------------------
MergeError Traceback (most recent call last)
<ipython-input-42-8a74cf63ba8e> in<module>()
----> 1pd.merge(df1,df2)
/Library/Python/2.7/site-packages/pandas/tools/merge.pyc inmerge(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator)
59 right_on=right_on, left_index=left_index,
60 right_index=right_index, sort=sort, suffixes=suffixes,
---> 61 copy=copy, indicator=indicator)
62 return op.get_result()
63if __debug__:
/Library/python/2.7/site-packages/pandas/tools/merge.pyc in__init__(self, left, right, how, on, left_on, right_on, axis, left_index, right_index, sort, suffixes, copy, indicator)
536 warnings.warn(msg, UserWarning)
537
--> 538 self._validate_specification()
539
540 # note this function has side effects
/Library/Python/2.7/site-packages/pandas/tools/merge.pyc in_validate_specification(self)
881 self.right.columns)
882 if len(common_cols)== 0:
--> 883 raise MergeError('No common columns to perform merge on')
884 if not common_cols.is_unique:
885 raise MergeError("Data columns not unique: %s"
MergeError: No common columns to perform merge on
這樣的操作會導致類似上面的錯誤,pandas找不到能夠進行合并的列。如果進行合并,其實有兩個思路可以考慮。第一種是根據(jù)現(xiàn)在的數(shù)據(jù)重新創(chuàng)建列名一致的數(shù)據(jù)對象,然后進行新的數(shù)據(jù)對象合并。但是,這樣在一定程度上來說就不是對最原始的數(shù)據(jù)進行處理了。不過,很多時候或許這也是一個值得考慮的手段。另外一種方法就是利用pandas自帶的功能,在進行數(shù)據(jù)合并的時候直接指明需要合并的列的名稱。具體的操作如下:
In [45]:pd.merge(df1,df2,left_on='key1:',right_on='key2')
Out[45]:
data1 key1: data2 key2
0 0 c 1 c
1 1 d 2 d
2 5 a 0 a
最初輸入pd.merge(df1,df2,left_on=‘key1’,right_on=‘key2’)結果報錯的時候很詫異,檢查數(shù)據(jù)才看到自己在創(chuàng)建數(shù)據(jù)的時候多出了一個冒號。不過,對于merge操作的默認行為測試中并沒有用到列名,前面的測試也就無需再做一次。在上面的運行結果中,數(shù)據(jù)列分別使用了兩組數(shù)據(jù)中獨立的名字,如果把兩組數(shù)據(jù)的獨立名字改成一致,這其實就是一個指定列的合并。而彼時,默認的merge合并應該會奏效,因為pandas能夠找到兩個列名一致的列。然而,指定了合并列名的操作中數(shù)據(jù)的標題會被pandas進行修改以進行區(qū)分。
In [49]:df1
Out[49]:
data key1
0 0 c
1 1 d
2 2 e
3 3 f
4 4 g
5 5 a
6 6 b
In [50]:df2
Out[50]:
data key2
0 0 a
1 1 c
2 2 d
In [51]:pd.merge(df1,df2)
Out[51]:
data key1 key2
0 0 c a
1 1 d c
2 2 e d
In [52]:pd.merge(df1,df2,left_on='key1',right_on='key2')
Out[52]:
data_x key1 data_y key2
0 0 c 1 c
1 1 d 2 d
2 5 a 0 a
從上面的結果中可以看出,pandas把兩個data分別以下劃線架x,y的形式進行了區(qū)分。
聯(lián)系客服