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))
| A | B | C | |
|---|---|---|---|
| 0 | A0 | B0 | C0 |
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
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
| A | B | |
|---|---|---|
| 1 | A1 | B1 |
| 2 | A2 | B2 |
df2
| A | B | |
|---|---|---|
| 3 | A3 | B3 |
| 4 | A4 | B4 |
pd.concat([df1, df2])
| A | B | |
|---|---|---|
| 1 | A1 | B1 |
| 2 | A2 | B2 |
| 3 | A3 | B3 |
| 4 | A4 | B4 |
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
| A | B | |
|---|---|---|
| 0 | A0 | B0 |
| 1 | A1 | B1 |
df4
| C | D | |
|---|---|---|
| 0 | C0 | D0 |
| 1 | C1 | D1 |
pd.concat([df3, df4], axis=1)
| A | B | C | D | |
|---|---|---|---|---|
| 0 | A0 | B0 | C0 | D0 |
| 1 | A1 | B1 | C1 | D1 |
인덱스 복제 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
| A | B | |
|---|---|---|
| 0 | A0 | B0 |
| 1 | A1 | B1 |
y
| A | B | |
|---|---|---|
| 0 | A2 | B2 |
| 1 | A3 | B3 |
pd.concat([x, y])
| A | B | |
|---|---|---|
| 0 | A0 | B0 |
| 1 | A1 | B1 |
| 0 | A2 | B2 |
| 1 | A3 | B3 |
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
| A | B | |
|---|---|---|
| 0 | A0 | B0 |
| 1 | A1 | B1 |
y
| A | B | |
|---|---|---|
| 0 | A2 | B2 |
| 1 | A3 | B3 |
pd.concat([x, y], ignore_index=True)
| A | B | |
|---|---|---|
| 0 | A0 | B0 |
| 1 | A1 | B1 |
| 2 | A2 | B2 |
| 3 | A3 | B3 |
다중 인덱스 키 추가하기 keys option
1
2
# 데이터 소스에 대한 레이블을 지정하는데 keys 옵션을 사용
display('x', 'y', "pd.concat([x, y], keys=['x', 'y'])")
x
| A | B | |
|---|---|---|
| 0 | A0 | B0 |
| 1 | A1 | B1 |
y
| A | B | |
|---|---|---|
| 0 | A2 | B2 |
| 1 | A3 | B3 |
pd.concat([x, y], keys=['x', 'y'])
| A | B | ||
|---|---|---|---|
| x | 0 | A0 | B0 |
| 1 | A1 | B1 | |
| y | 0 | A2 | B2 |
| 1 | A3 | B3 |
조인을 이용한 연결 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
| A | B | C | |
|---|---|---|---|
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
df6
| B | C | D | |
|---|---|---|---|
| 3 | B3 | C3 | D3 |
| 4 | B4 | C4 | D4 |
pd.concat([df5, df6])
| A | B | C | D | |
|---|---|---|---|---|
| 1 | A1 | B1 | C1 | NaN |
| 2 | A2 | B2 | C2 | NaN |
| 3 | NaN | B3 | C3 | D3 |
| 4 | NaN | B4 | C4 | D4 |
1
2
3
# 기본적으로 조인은 합집합(outer) 이지만, inner를 사용해 열의 교집합으로 변경
display('df5', 'df6',
"pd.concat([df5, df6], join='inner')")
df5
| A | B | C | |
|---|---|---|---|
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
df6
| B | C | D | |
|---|---|---|---|
| 3 | B3 | C3 | D3 |
| 4 | B4 | C4 | D4 |
pd.concat([df5, df6], join='inner')
| B | C | |
|---|---|---|
| 1 | B1 | C1 |
| 2 | B2 | C2 |
| 3 | B3 | C3 |
| 4 | B4 | C4 |
1
2
3
4
# join_axes의 지원 종료로 인해 직접적으로 명시하여 사용
join_axes = pd.concat([df5, df6])
join_axes = join_axes[df5.columns]
display('df5', 'df6', "join_axes")
df5
| A | B | C | |
|---|---|---|---|
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
df6
| B | C | D | |
|---|---|---|---|
| 3 | B3 | C3 | D3 |
| 4 | B4 | C4 | D4 |
join_axes
| A | B | C | |
|---|---|---|---|
| 1 | A1 | B1 | C1 |
| 2 | A2 | B2 | C2 |
| 3 | NaN | B3 | C3 |
| 4 | NaN | B4 | C4 |
The append() method
1
2
3
# pandas 1.0.0 버전부터 지원 종료 --> concat() 사용
# df1.append(df2)
pd.concat([df1, df2])
| A | B | |
|---|---|---|
| 1 | A1 | B1 |
| 2 | A2 | B2 |
| 3 | A3 | B3 |
| 4 | A4 | B4 |
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.