1. 程式人生 > >使用Python pandas對不同列名的資料進行合併

使用Python pandas對不同列名的資料進行合併

使用pandasmerge方法進行資料合併的時候,如果列名相同則可以省去列名的指定,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

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)

     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分別以下劃線架xy的形式進行了區分。