使用Python pandas對不同列名的資料進行合併
使用pandas的merge方法進行資料合併的時候,如果列名相同則可以省去列名的指定,pandas會進行自動的識別。但是如果兩組資料的列名不一致,不加任何引數直接進行預設的操作則會導致報錯。
例如有如下兩組資料:
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
嘗試進行資料合併,結果提示如下:
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
59 right_on=right_on, left_index=left_index,
60 right_index=right_index, sort=sort, suffixes=suffixes,
---> 61 copy=copy, indicator=indicator)
62return 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
--> 538self._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)
882if len(common_cols)==0:
--> 883raise MergeError('No common columns to perform merge on')
884ifnot common_cols.is_unique:
885 raise MergeError("Data columns not unique: %s"
MergeError: No common columns to perform merge on
這樣的操作會導致類似上面的錯誤,pandas找不到能夠進行合併的列。如果進行合併,其實有兩個思路可以考慮。第一種是根據現在的資料重新建立列名一致的資料物件,然後進行新的資料物件合併。但是,這樣在一定程度上來說就不是對最原始的資料進行處理了。不過,很多時候或許這也是一個值得考慮的手段。另外一種方法就是利用pandas自帶的功能,在進行資料合併的時候直接指明需要合併的列的名稱。具體的操作如下:
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’)結果報錯的時候很詫異,檢查資料才看到自己在建立資料的時候多出了一個冒號。不過,對於merge操作的預設行為測試中並沒有用到列名,前面的測試也就無需再做一次。在上面的執行結果中,資料列分別使用了兩組資料中獨立的名字,如果把兩組資料的獨立名字改成一致,這其實就是一個指定列的合併。而彼時,預設的merge合併應該會奏效,因為pandas能夠找到兩個列名一致的列。然而,指定了合併列名的操作中資料的標題會被pandas進行修改以進行區分。
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的形式進行了區分。