[python] pandas データフレームの結合 -concat-

# はじめに
業務自動化を進めているが、なんとかエクセルファイルからデータのみを取り出したとき、
抽出したデータを一つにまとめる方法をまとまる。


# 環境
window 10 home 
```python
import platform
print('python version: ' , platform.python_version())
# python version:  3.7.8
import pandas as pd
print('pandans version: ',pd.__version__)
# pandans version:  1.3.5

```


# Code

## データフレームの準備
```python
df_1 = pd.DataFrame({'A': ['A1', 'A2', 'A3'],
                    'B': ['B1', 'B2', 'B3'],
                    'C': ['C1', 'C2', 'C3']},
                   index=['ONE', 'TWO', 'THREE'])
print(df_1)
"""
        A   B   C
ONE    A1  B1  C1
TWO    A2  B2  C2
THREE  A3  B3  C3
"""

df_2 = pd.DataFrame({'C': ['C1', 'C2', 'C3'],
                    'D': ['D1', 'D2', 'D3'],
                    'E': ['E1', 'E2', 'E3'],},
                   index=['ONE', 'TWO', 'THREE'])
print(df_2)
"""
        C   D   E
ONE    C1  D1  E1
TWO    C2  D2  E2
THREE  C3  D3  E3
"""

df_3 = pd.DataFrame({'D': ['D1', 'D2', 'D3'],
                    'E': ['E1', 'E2', 'E3'],
                    'F': ['F1', 'F2', 'F3']},
                   index=['first', 'second', 'thrid'])
print(df_3)
"""
         D   E   F
first   D1  E1  F1
second  D2  E2  F2
thrid   D3  E3  F3
"""

```

## データフレームの結合 -Concat-
データフレーム（もしくはシリーズ）同士を結合する
```python
df_concat = pd.concat([df_1, df_2])
print(df_concat)
"""
         A    B   C    D    E
ONE     A1   B1  C1  NaN  NaN
TWO     A2   B2  C2  NaN  NaN
THREE   A3   B3  C3  NaN  NaN
ONE    NaN  NaN  C1   D1   E1
TWO    NaN  NaN  C2   D2   E2
THREE  NaN  NaN  C3   D3   E3
"""

```
## 連結方向（縦、横）の指定 -axis-
縦は`axis = 0`
横は`aixs = 1`
で指定する
指定がない場合は`axis = 0 `となる
```python
df_concat = pd.concat([df_1, df_2], axis=0)
print(df_concat)
"""
         A    B   C    D    E
ONE     A1   B1  C1  NaN  NaN
TWO     A2   B2  C2  NaN  NaN
THREE   A3   B3  C3  NaN  NaN
ONE    NaN  NaN  C1   D1   E1
TWO    NaN  NaN  C2   D2   E2
THREE  NaN  NaN  C3   D3   E3
"""


df_concat = pd.concat([df_1, df_1], axis=0)
print(df_concat)
"""
        A   B   C
ONE    A1  B1  C1
TWO    A2  B2  C2
THREE  A3  B3  C3
ONE    A1  B1  C1
TWO    A2  B2  C2
THREE  A3  B3  C3
"""


df_concat = pd.concat([df_1, df_2], axis=1)
print(df_concat)
"""
        A   B   C   C   D   E
ONE    A1  B1  C1  C1  D1  E1
TWO    A2  B2  C2  C2  D2  E2
THREE  A3  B3  C3  C3  D3  E3
"""


df_concat = pd.concat([df_1, df_3], axis=1)
print(df_concat)
"""
          A    B    C    D    E    F
ONE      A1   B1   C1  NaN  NaN  NaN
TWO      A2   B2   C2  NaN  NaN  NaN
THREE    A3   B3   C3  NaN  NaN  NaN
first   NaN  NaN  NaN   D1   E1   F1
second  NaN  NaN  NaN   D2   E2   F2
thrid   NaN  NaN  NaN   D3   E3   F3
"""
```
## 連結方法（外部結合・内部結合）の指定 -join-
`join='outer'`であればすべてを含む（デフォルト）
`join='inner'`はNaNを含まない列もしくは行のみを残す
```python
df_concat = pd.concat([df_1, df_2], axis=0, join='outer')
print(df_concat)
"""
         A    B   C    D    E
ONE     A1   B1  C1  NaN  NaN
TWO     A2   B2  C2  NaN  NaN
THREE   A3   B3  C3  NaN  NaN
ONE    NaN  NaN  C1   D1   E1
TWO    NaN  NaN  C2   D2   E2
THREE  NaN  NaN  C3   D3   E3
"""

df_concat = pd.concat([df_1, df_2], axis=0, join='inner')
print(df_concat)
"""
        C
ONE    C1
TWO    C2
THREE  C3
ONE    C1
TWO    C2
THREE  C3
"""
```

## 連結時の並び変え -sort-
`sort=Flase`がデフォルトとして設定されている
`sort=True`にすることによって並び変えをする
`axis=0`の縦の結合なら列のみが
`axis=1`の横の結合なら行のみが
並び変えられる
```python
df_4 = pd.DataFrame({'C': ['C3', 'C2', 'C1'],
                    'D': ['D3', 'D2', 'D1'],
                    'A': ['A3', 'A2', 'A1']},
                   index=[3, 2, 1])
                   
df_concat = pd.concat([df_4, df_4], axis=0)
print(df_concat)
"""
    C   D   A
3  C3  D3  A3
2  C2  D2  A2
1  C1  D1  A1
3  C3  D3  A3
2  C2  D2  A2
1  C1  D1  A1
"""

df_concat = pd.concat([df_4, df_4], axis=0, sort=True)
print(df_concat)
"""
    A   C   D
3  A3  C3  D3
2  A2  C2  D2
1  A1  C1  D1
3  A3  C3  D3
2  A2  C2  D2
1  A1  C1  D1
"""
             
df_concat = pd.concat([df_4, df_4], axis=1, sort=True)
print(df_concat)
"""
    C   D   A   C   D   A
1  C1  D1  A1  C1  D1  A1
2  C2  D2  A2  C2  D2  A2
3  C3  D3  A3  C3  D3  A3
"""
```

# まとめ
ほとんどの場合は縦、横の指定だけで目的のほとんどは達成されるのではないかと思う。

# 参考

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.concat.html