[Python] pandas データ結合

mergeとconcatについてメモ。

# pandas読み込み

```python
import pandas as pd
from pandas import Series, DataFrame
```

# 結合の仕方

## merge
[公式](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.merge.html#pandas.DataFrame.merge)

```python

pd.merge(left_DataFrame, right_DataFrame,
           how='inner',
           on=None, left_on=None, right_on=None, 
           left_index=False, right_index=False, 
           sort=False,
           suffixes=('_x', '_y'))
```

|引数  |説明  |
|---|-------|
|how  |joinの仕方。 （'left', 'right', 'outer', 'inner'）  defaultは'inner'|
|axis |行か列か、0 or 1  |
|left_on |左側の結合する列またはインデックスの名前。 |
|right_on |右側の結合する列またはインデックスの名前。 |
|left_index |左側のインデックスでマージする時。boolean, default False|
|right_index  |右側のインデックスでマージする時。boolean, default False|
|sort |結果の結合キーを辞書的にソート。順序はjoinの仕方によって異なる。boolean, default False |
|suffixes |両方で重複する列名に接尾語を付ける。 hoge_1,hoge_2みたいな。defaultは'_x','_y'|


## 実際にデータでやってみる。

```python
# データ1の準備
attri_data1 = {'ID':['100','101','102','105','106']
        ,'city':['Tokyo','Chiba','Kyoto','Gunma','Tokyo']
        ,'birth_year':[1991,1992,1985,1996,1981]
        ,'name':['Yamada','Sato','Suzuki','Kitamura','Aoki']}
data_frame1 = DataFrame(attri_data1)

# データ2の準備
attri_data2 = {'ID':['100','101','102','103','104']
        ,'math':[34,77,45,81,98]
        ,'English':[47,64,16,53,37]
        ,'sex':['F','M','F','F','M']
        ,'index_num':[0,1,2,3,4]}
data_frame2 = DataFrame(attri_data2)

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198971/d9e2c0e5-d524-028c-f73c-fa7129a67bee.png)



### inner join
```python
# IDで内部結合
pd.merge(data_frame1, data_frame2, how="inner" ,on="ID")
```
↓　　↓　　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198971/bb1b6db5-a9cb-de51-36ae-7a6507007ecb.png)


### left join

```python
# left join
pd.merge(data_frame1, data_frame2, how="left", on="ID")
```
↓　　↓　　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198971/10fa567f-f2ab-cf8f-f436-75820675b64c.png)

### outer join

```python
# outer join
pd.merge(data_frame1, data_frame2, how="outer")
```
↓　　↓　　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198971/7b224718-30f5-1486-3f28-4da87275ce5d.png)


### indexによる結合

```python
# indexによる結合
pd.merge(data_frame1, data_frame2, left_index=True, right_on="index_num")
```
↓　　↓　　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198971/406713f2-1549-d6c0-45bf-61ea106083ff.png)



# concat


mergeと似ているが、基本的にはデータの下に、そのままもう１つのデータをくっつける時に使う。
[公式](https://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html)

## 実際にデータでやってみる。

```python
# データ1の準備
attri_data1 = {'ID':['100','101','102','105','106']
        ,'city':['Tokyo','Chiba','Kyoto','Gunma','Tokyo']
        ,'birth_year':[1991,1992,1985,1996,1981]
        ,'name':['Yamada','Sato','Suzuki','Kitamura','Aoki']}
data_frame1 = DataFrame(attri_data1)

# データ3の準備
attri_data3 = {'ID':['110','111','112']
        ,'city':['Akita','Okinawa','Fukuoka']
        ,'birth_year':[1992,1987,1990]
        ,'name':['Ishida','Takada','Shimada']}
data_frame3 = DataFrame(attri_data3)

```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198971/3e70d071-1808-5795-0909-67c33614f8a6.png)


### concat


```python
# concat
pd.concat([data_frame1, data_frame3])
```
↓　　↓　　↓
![image.png](https://qiita-image-store.s3.amazonaws.com/0/198971/d0a0a082-b59f-8c80-61ff-419e9a42c857.png)

# 参考
[Pandas でデータフレームの結合 (マージ, JOIN)](https://pythondatascience.plavox.info/pandas/pandas%E3%81%A7%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%82%92%E7%B5%90%E5%90%88)