使用pandas的merge方法進行數(shù)據(jù)合并的時候,如果列名相同則可以省去列名的指定,pandas會進行自動的識別。但是如果兩組數(shù)據(jù)的列名不一致,不加任何參數(shù)直接進行默認的操作則會導(dǎo)致報錯。 例如有如下兩組數(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ù)合并,結(jié)果提示如下: In [42]: pd.merge(df1,df2) --------------------------------------------------------------------------- MergeError Traceback (most recent call last) <ipython-input-42-8a74cf63ba8e> in <module>() ----> 1 pd.merge(df1,df2)
/Library/Python/2.7/site-packages/pandas/tools/merge.pyc in merge(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() 63 if __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
這樣的操作會導(dǎo)致類似上面的錯誤,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’)結(jié)果報錯的時候很詫異,檢查數(shù)據(jù)才看到自己在創(chuàng)建數(shù)據(jù)的時候多出了一個冒號。不過,對于merge操作的默認行為測試中并沒有用到列名,前面的測試也就無需再做一次。在上面的運行結(jié)果中,數(shù)據(jù)列分別使用了兩組數(shù)據(jù)中獨立的名字,如果把兩組數(shù)據(jù)的獨立名字改成一致,這其實就是一個指定列的合并。而彼時,默認的merge合并應(yīng)該會奏效,因為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
從上面的結(jié)果中可以看出,pandas把兩個data分別以下劃線架x,y的形式進行了區(qū)分。 |
|