포스트

Concat_And_Append

Concat_And_Append

Combining Datasets: Concat and Append

1
2
import pandas as pd
import numpy as np
1
2
3
4
5
6
7
8
9
def make_df(cols, ind):
    """Quickly make a DataFrame"""
    data = {c: [str(c) + str(i) for i in ind]
            for c in cols}
    return pd.DataFrame(data, ind)


# example DataFrame
make_df('ABC', range(3))
ABC
0A0B0C0
1A1B1C1
2A2B2C2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class display(object):
    """Display HTML representation of multiple objects"""
    template = """<div style="float: left; padding: 10px;">
    <p style='font-family:"Courier New", Courier, monospace'>{0}</p>{1}
    </div>"""

    def __init__(self, *args):
        self.args = args

    def _repr_html_(self):
        return '\n'.join(self.template.format(a, eval(a)._repr_html_())
                         for a in self.args)

    def __repr__(self):
        return '\n\n'.join(a + '\n' + repr(eval(a))
                           for a in self.args)

복습: NumPy 배열 연결 Concatenation of NumPy Arrays

1
2
3
4
5
# 두 개 이상의 배열의 콘텐츠를 하나의 배열로 결
x = [1, 2, 3]
y = [4, 5, 6]
z = [7, 8, 9]
np.concatenate([x, y, z])
1
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
1
2
3
x = [[1, 2],
     [3, 4]]
np.concatenate([x, x], axis=1)
1
2
array([[1, 2, 1, 2],
       [3, 4, 3, 4]])

pd.concat을 이용한 간단한 연결 Simple Concatenation with pd.concat

pd.concat?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Signature:

pd.concat(

    objs: 'Iterable[Series | DataFrame] | Mapping[HashableT, Series | DataFrame]',

*,

axis: 'Axis' = 0,

join: 'str' = 'outer',

ignore_index: 'bool' = False,

keys = None,

levels = None,

names: 'list[HashableT] | None' = None,

verify_integrity: 'bool' = False,

sort: 'bool' = False,

copy: 'bool | None' = None,

) -> 'DataFr  ame | Series'

```python
# Series나 DataFrame 객체를 간단하게 연결할 때 사용
ser1 = pd.Series(['A', 'B', 'C'], index=[1, 2, 3])
ser2 = pd.Series(['D', 'E', 'F'], index=[4, 5, 6])
pd.concat([ser1, ser2])
1
2
3
4
5
6
7
1    A
2    B
3    C
4    D
5    E
6    F
dtype: object
1
2
3
4
# DataFrame 같은 고차원 객체 연결 가능
df1 = make_df('AB', [1, 2])
df2 = make_df('AB', [3, 4])
display('df1', 'df2', 'pd.concat([df1, df2])')

df1

AB
1A1B1
2A2B2

df2

AB
3A3B3
4A4B4

pd.concat([df1, df2])

AB
1A1B1
2A2B2
3A3B3
4A4B4
1
2
3
4
# 기본적으로 연결은 DataFrame 내에서 행단위(axis=0)로 일어나며 축 지정 가능
df3 = make_df('AB', [0, 1])
df4 = make_df('CD', [0, 1])
display('df3', 'df4', "pd.concat([df3, df4], axis=1)")

df3

AB
0A0B0
1A1B1

df4

CD
0C0D0
1C1D1

pd.concat([df3, df4], axis=1)

ABCD
0A0B0C0D0
1A1B1C1D1

인덱스 복제 Duplicate indices

1
2
3
4
5
# Pandas에서의 연결은 그 결과가 복제된 인덱스를 가지더라도 인덱스를 유지
x = make_df('AB', [0, 1])
y = make_df('AB', [2, 3])
y.index = x.index  # make duplicate indices!
display('x', 'y', 'pd.concat([x, y])')

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y])

AB
0A0B0
1A1B1
0A2B2
1A3B3

DataFrame내에서는 유효하지만 결과가 바람직하지 않은 경우

반복을 에러로 잡아내기 Verify_integrity flag

1
2
3
4
5
# 플래그를 True로 설정하면 연결 작업에서 중복 인덱스가 있을 때 예외가 발생
try:
    pd.concat([x, y], verify_integrity=True)
except ValueError as e:
    print("ValueError:", e)
1
ValueError: Indexes have overlapping values: Index([0, 1], dtype='int64')

인덱스를 무시하기 ignore_index flag

1
2
# 플래그를 True로 설정하면 연결 작업은 결과 Series에 새로운 정수 인덱스를 생성
display('x', 'y', 'pd.concat([x, y], ignore_index=True)')

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y], ignore_index=True)

AB
0A0B0
1A1B1
2A2B2
3A3B3

다중 인덱스 키 추가하기 keys option

1
2
# 데이터 소스에 대한 레이블을 지정하는데 keys 옵션을 사용
display('x', 'y', "pd.concat([x, y], keys=['x', 'y'])")

x

AB
0A0B0
1A1B1

y

AB
0A2B2
1A3B3

pd.concat([x, y], keys=['x', 'y'])

AB
x0A0B0
1A1B1
y0A2B2
1A3B3

조인을 이용한 연결 Concatenation with joins

1
2
3
4
# 채울 값이 없는 항목은 기본적으로 NA값으로 채움
df5 = make_df('ABC', [1, 2])
df6 = make_df('BCD', [3, 4])
display('df5', 'df6', 'pd.concat([df5, df6])')

df5

ABC
1A1B1C1
2A2B2C2

df6

BCD
3B3C3D3
4B4C4D4

pd.concat([df5, df6])

ABCD
1A1B1C1NaN
2A2B2C2NaN
3NaNB3C3D3
4NaNB4C4D4
1
2
3
# 기본적으로 조인은 합집합(outer) 이지만, inner를 사용해 열의 교집합으로 변경
display('df5', 'df6',
        "pd.concat([df5, df6], join='inner')")

df5

ABC
1A1B1C1
2A2B2C2

df6

BCD
3B3C3D3
4B4C4D4

pd.concat([df5, df6], join='inner')

BC
1B1C1
2B2C2
3B3C3
4B4C4
1
2
3
4
# join_axes의 지원 종료로 인해 직접적으로 명시하여 사용
join_axes = pd.concat([df5, df6])
join_axes = join_axes[df5.columns]
display('df5', 'df6', "join_axes")

df5

ABC
1A1B1C1
2A2B2C2

df6

BCD
3B3C3D3
4B4C4D4

join_axes

ABC
1A1B1C1
2A2B2C2
3NaNB3C3
4NaNB4C4

The append() method

1
2
3
# pandas 1.0.0 버전부터 지원 종료 --> concat() 사용
# df1.append(df2)
pd.concat([df1, df2])
AB
1A1B1
2A2B2
3A3B3
4A4B4
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.