판다스
판다스 5장 데이터 연결하기 - concat/ merge
막막한
2023. 3. 8. 20:50
concat 메서드 사용하기¶
In [2]:
# 분석하기 좋은 데이터 - 데이터 집합을 분석하기 좋은 상태로 만들어 놓은 것
#깔끔한 데이터 조건
''' 데이터 분석 목젝에 맞는 데이터 모아 새로운 표 만들기
측정한 값은 행 구성
변수는 열로 구성
'''
# 데이터 연결하려면 concat 메서드 사용
import pandas as pd
df1=pd.read_csv('../data/concat_1.csv')
df2=pd.read_csv('../data/concat_2.csv')
df3=pd.read_csv('../data/concat_3.csv')
In [3]:
# concat 메서드는 데이터 프레임 연실 시 위에서 아래 방향으로 연결
row_concat=pd.concat([df1, df2, df3])
row_concat
Out[3]:
A | B | C | D | |
---|---|---|---|---|
0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
0 | a4 | b4 | c4 | d4 |
1 | a5 | b5 | c5 | d5 |
2 | a6 | b6 | c6 | d6 |
3 | a7 | b7 | c7 | d7 |
0 | a8 | b8 | c8 | d8 |
1 | a9 | b9 | c9 | d9 |
2 | a10 | b10 | c10 | d10 |
3 | a11 | b11 | c11 | d11 |
In [4]:
row_concat.iloc[3,] #df의 네번째 행 추출
Out[4]:
A a3
B b3
C c3
D d3
Name: 3, dtype: object
데이터프레임에 시리즈 연결하기¶
In [5]:
# 시리즈 추가하기 , 먼저 리스트를 시리즈로 변환
new_row_series = pd.Series(['n1', 'n2', 'n3', 'n4'])
In [6]:
pd.concat([df1, new_row_series])
# 행이 아니라 새로운 열로 추가된다
Out[6]:
A | B | C | D | 0 | |
---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | NaN |
1 | a1 | b1 | c1 | d1 | NaN |
2 | a2 | b2 | c2 | d2 | NaN |
3 | a3 | b3 | c3 | d3 | NaN |
0 | NaN | NaN | NaN | NaN | n1 |
1 | NaN | NaN | NaN | NaN | n2 |
2 | NaN | NaN | NaN | NaN | n3 |
3 | NaN | NaN | NaN | NaN | n4 |
행 1개로 구성된 데이터프레임 생성하여 연결하기¶
In [9]:
# 시리즈는 열 이름이 없기때문에 새로운 행으로 연결이 제대로 안된다/ 시리즈를 새로운 열로 간주해 0이라는 이름의 열로 추가된 것
#1개의 행을 가지는 데이터프레임 생성해 df1 연결
new_row_df=pd.DataFrame([['n1', 'n2', 'n3', 'n4']], columns=['A', 'B', 'C', 'D'])
print(new_row_df)
print(pd.concat([df1, new_row_df]))
A B C D
0 n1 n2 n3 n4
A B C D
0 a0 b0 c0 d0
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3
0 n1 n2 n3 n4
In [10]:
# 연결할 데이터프레임이 1개라면 append 메서드 사용 가능
df1.append(new_row_df)
C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_22740\3866396767.py:3: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
df1.append(new_row_df)
Out[10]:
A | B | C | D | |
---|---|---|---|---|
0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
0 | n1 | n2 | n3 | n4 |
In [12]:
# ignore_index=True --> 데이터 연결하고 데이터프레임의 인덱스를 0부터 다시 지정하는 것
data_dict={'A' : 'n1', 'B': 'n2', 'C': 'n3', 'D': 'n4'}
print(df1.append(data_dict, ignore_index=True))
A B C D
0 a0 b0 c0 d0
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3
4 n1 n2 n3 n4
C:\Users\Public\Documents\ESTsoft\CreatorTemp\ipykernel_22740\2532344687.py:4: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
print(df1.append(data_dict, ignore_index=True))
다양한 방법으로 데이터 연결하기¶
In [13]:
row_concat_i = pd.concat([df1, df2, df3], ignore_index=True)
row_concat_i
Out[13]:
A | B | C | D | |
---|---|---|---|---|
0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
4 | a4 | b4 | c4 | d4 |
5 | a5 | b5 | c5 | d5 |
6 | a6 | b6 | c6 | d6 |
7 | a7 | b7 | c7 | d7 |
8 | a8 | b8 | c8 | d8 |
9 | a9 | b9 | c9 | d9 |
10 | a10 | b10 | c10 | d10 |
11 | a11 | b11 | c11 | d11 |
In [15]:
# 열 방향으로 데이터 연결하기
col_concat= pd.concat([df1, df2, df3], axis=1) #axis의 기본값은 0
col_concat
Out[15]:
A | B | C | D | A | B | C | D | A | B | C | D | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a4 | b4 | c4 | d4 | a8 | b8 | c8 | d8 |
1 | a1 | b1 | c1 | d1 | a5 | b5 | c5 | d5 | a9 | b9 | c9 | d9 |
2 | a2 | b2 | c2 | d2 | a6 | b6 | c6 | d6 | a10 | b10 | c10 | d10 |
3 | a3 | b3 | c3 | d3 | a7 | b7 | c7 | d7 | a11 | b11 | c11 | d11 |
In [16]:
# 같은 열 이름이 있는 데이터프레임에서 열이름으로 데이터 추출하면 해당 열 이름의 데이터 추출
col_concat['A']
Out[16]:
A | A | A | |
---|---|---|---|
0 | a0 | a4 | a8 |
1 | a1 | a5 | a9 |
2 | a2 | a6 | a10 |
3 | a3 | a7 | a11 |
In [17]:
# 새로운 열 추가
col_concat['new_col_list']=['n1', 'n2', 'n3', 'n4']
col_concat
Out[17]:
A | B | C | D | A | B | C | D | A | B | C | D | new_col_list | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a4 | b4 | c4 | d4 | a8 | b8 | c8 | d8 | n1 |
1 | a1 | b1 | c1 | d1 | a5 | b5 | c5 | d5 | a9 | b9 | c9 | d9 | n2 |
2 | a2 | b2 | c2 | d2 | a6 | b6 | c6 | d6 | a10 | b10 | c10 | d10 | n3 |
3 | a3 | b3 | c3 | d3 | a7 | b7 | c7 | d7 | a11 | b11 | c11 | d11 | n4 |
In [18]:
# 인덱스 이름 설정
pd.concat([df1, df2, df3], axis=1, ignore_index=True)
Out[18]:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a4 | b4 | c4 | d4 | a8 | b8 | c8 | d8 |
1 | a1 | b1 | c1 | d1 | a5 | b5 | c5 | d5 | a9 | b9 | c9 | d9 |
2 | a2 | b2 | c2 | d2 | a6 | b6 | c6 | d6 | a10 | b10 | c10 | d10 |
3 | a3 | b3 | c3 | d3 | a7 | b7 | c7 | d7 | a11 | b11 | c11 | d11 |
공통 열과 공통 인덱스만 연결하기¶
In [21]:
# df1, df2, df3 열 이름 재설정
df1.columns=['A', 'B', 'C', 'D']
df2.columns=['E', 'F', 'G', 'H']
df3.columns=['A', 'C', 'F', 'H']
print(df1)
print(type(df1))
print(df2)
print(type(df2))
print(df3)
print(type(df3))
#각 데이터프레임의 열 이름 중복
A B C D
0 a0 b0 c0 d0
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3
<class 'pandas.core.frame.DataFrame'>
E F G H
0 a4 b4 c4 d4
1 a5 b5 c5 d5
2 a6 b6 c6 d6
3 a7 b7 c7 d7
<class 'pandas.core.frame.DataFrame'>
In [22]:
# 새롭게 열 이름 부여한 데이터프레임 3개를 concat 메서드로 연결
row_concat=pd.concat([df1, df2, df3])
row_concat
Out[22]:
A | B | C | D | E | F | G | H | |
---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | NaN | NaN | NaN | NaN |
1 | a1 | b1 | c1 | d1 | NaN | NaN | NaN | NaN |
2 | a2 | b2 | c2 | d2 | NaN | NaN | NaN | NaN |
3 | a3 | b3 | c3 | d3 | NaN | NaN | NaN | NaN |
0 | NaN | NaN | NaN | NaN | a4 | b4 | c4 | d4 |
1 | NaN | NaN | NaN | NaN | a5 | b5 | c5 | d5 |
2 | NaN | NaN | NaN | NaN | a6 | b6 | c6 | d6 |
3 | NaN | NaN | NaN | NaN | a7 | b7 | c7 | d7 |
0 | a8 | NaN | b8 | NaN | NaN | c8 | NaN | d8 |
1 | a9 | NaN | b9 | NaN | NaN | c9 | NaN | d9 |
2 | a10 | NaN | b10 | NaN | NaN | c10 | NaN | d10 |
3 | a11 | NaN | b11 | NaN | NaN | c11 | NaN | d11 |
In [24]:
# 누락값 없이 데이터 연결하는 방법 --> 공통 열만 골라 연결하면 누락값 생기지 않는다
# 공통열골라 연결할려면 join 인자를 inner 로 지정
# 하지만 위 데이터 프레임은 공통열이 없다 --> empty dataframe
pd.concat([df1, df2, df3], join='inner')
Out[24]:
0 |
---|
1 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
3 |
In [26]:
# df1, df3 공통열 연결, a c 만 연결
pd.concat([df1, df3], ignore_index=False, join='inner')
Out[26]:
A | C | |
---|---|---|
0 | a0 | c0 |
1 | a1 | c1 |
2 | a2 | c2 |
3 | a3 | c3 |
0 | a8 | b8 |
1 | a9 | b9 |
2 | a10 | b10 |
3 | a11 | b11 |
In [27]:
# 행방향으로 연결
df1.index=[0, 1, 2, 3]
df2.index=[4, 5, 6, 7]
df3.index=[0, 2, 5, 7]
print(df1)
print(df2)
print(df3)
A B C D
0 a0 b0 c0 d0
1 a1 b1 c1 d1
2 a2 b2 c2 d2
3 a3 b3 c3 d3
E F G H
4 a4 b4 c4 d4
5 a5 b5 c5 d5
6 a6 b6 c6 d6
7 a7 b7 c7 d7
A C F H
0 a8 b8 c8 d8
2 a9 b9 c9 d9
5 a10 b10 c10 d10
7 a11 b11 c11 d11
In [28]:
# 행방향 연결
col_concat=pd.concat([df1, df2, df3], axis=1)
col_concat
Out[28]:
A | B | C | D | E | F | G | H | A | C | F | H | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | NaN | NaN | NaN | NaN | a8 | b8 | c8 | d8 |
1 | a1 | b1 | c1 | d1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | a2 | b2 | c2 | d2 | NaN | NaN | NaN | NaN | a9 | b9 | c9 | d9 |
3 | a3 | b3 | c3 | d3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | a4 | b4 | c4 | d4 | NaN | NaN | NaN | NaN |
5 | NaN | NaN | NaN | NaN | a5 | b5 | c5 | d5 | a10 | b10 | c10 | d10 |
6 | NaN | NaN | NaN | NaN | a6 | b6 | c6 | d6 | NaN | NaN | NaN | NaN |
7 | NaN | NaN | NaN | NaN | a7 | b7 | c7 | d7 | a11 | b11 | c11 | d11 |
In [29]:
# df1, df3 공통 행 연결
pd.concat([df1, df3], axis=1, join='inner')
Out[29]:
A | B | C | D | A | C | F | H | |
---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a8 | b8 | c8 | d8 |
2 | a2 | b2 | c2 | d2 | a9 | b9 | c9 | d9 |
merge 메서드 사용하기¶
In [31]:
person=pd.read_csv('../data/survey_person.csv')
site=pd.read_csv('../data/survey_site.csv')
survey=pd.read_csv('../data/survey_survey.csv')
visited=pd.read_csv('../data/survey_visited.csv')
print(person)
ident personal family
0 dyer William Dyer
1 pb Frank Pabodie
2 lake Anderson Lake
3 roe Valentina Roerich
4 danforth Frank Danforth
In [33]:
visited_subset=visited.loc[[0,2,6], ]
o2o_merge=site.merge(visited_subset, left_on='name', right_on='site')
o2o_merge
Out[33]:
name | lat | long | ident | site | dated | |
---|---|---|---|---|---|---|
0 | DR-1 | -49.85 | -128.57 | 619 | DR-1 | 1927-02-08 |
1 | DR-3 | -47.15 | -126.72 | 734 | DR-3 | 1939-01-07 |
2 | MSK-4 | -48.87 | -123.40 | 837 | MSK-4 | 1932-01-14 |
In [34]:
# site, visited 연결
m2o_merge=site.merge(visited, left_on='name', right_on='site')
m2o_merge
Out[34]:
name | lat | long | ident | site | dated | |
---|---|---|---|---|---|---|
0 | DR-1 | -49.85 | -128.57 | 619 | DR-1 | 1927-02-08 |
1 | DR-1 | -49.85 | -128.57 | 622 | DR-1 | 1927-02-10 |
2 | DR-1 | -49.85 | -128.57 | 844 | DR-1 | 1932-03-22 |
3 | DR-3 | -47.15 | -126.72 | 734 | DR-3 | 1939-01-07 |
4 | DR-3 | -47.15 | -126.72 | 735 | DR-3 | 1930-01-12 |
5 | DR-3 | -47.15 | -126.72 | 751 | DR-3 | 1930-02-26 |
6 | DR-3 | -47.15 | -126.72 | 752 | DR-3 | NaN |
7 | MSK-4 | -48.87 | -123.40 | 837 | MSK-4 | 1932-01-14 |
In [37]:
ps=person.merge(survey, left_on='ident', right_on='person')
vs=visited.merge(survey, left_on='ident', right_on='taken')
print(ps)
print(vs)
ident personal family taken person quant reading
0 dyer William Dyer 619 dyer rad 9.82
1 dyer William Dyer 619 dyer sal 0.13
2 dyer William Dyer 622 dyer rad 7.80
3 dyer William Dyer 622 dyer sal 0.09
4 pb Frank Pabodie 734 pb rad 8.41
5 pb Frank Pabodie 734 pb temp -21.50
6 pb Frank Pabodie 735 pb rad 7.22
7 pb Frank Pabodie 751 pb rad 4.35
8 pb Frank Pabodie 751 pb temp -18.50
9 lake Anderson Lake 734 lake sal 0.05
10 lake Anderson Lake 751 lake sal 0.10
11 lake Anderson Lake 752 lake rad 2.19
12 lake Anderson Lake 752 lake sal 0.09
13 lake Anderson Lake 752 lake temp -16.00
14 lake Anderson Lake 837 lake rad 1.46
15 lake Anderson Lake 837 lake sal 0.21
16 roe Valentina Roerich 752 roe sal 41.60
17 roe Valentina Roerich 837 roe sal 22.50
18 roe Valentina Roerich 844 roe rad 11.25
ident site dated taken person quant reading
0 619 DR-1 1927-02-08 619 dyer rad 9.82
1 619 DR-1 1927-02-08 619 dyer sal 0.13
2 622 DR-1 1927-02-10 622 dyer rad 7.80
3 622 DR-1 1927-02-10 622 dyer sal 0.09
4 734 DR-3 1939-01-07 734 pb rad 8.41
5 734 DR-3 1939-01-07 734 lake sal 0.05
6 734 DR-3 1939-01-07 734 pb temp -21.50
7 735 DR-3 1930-01-12 735 pb rad 7.22
8 735 DR-3 1930-01-12 735 NaN sal 0.06
9 735 DR-3 1930-01-12 735 NaN temp -26.00
10 751 DR-3 1930-02-26 751 pb rad 4.35
11 751 DR-3 1930-02-26 751 pb temp -18.50
12 751 DR-3 1930-02-26 751 lake sal 0.10
13 752 DR-3 NaN 752 lake rad 2.19
14 752 DR-3 NaN 752 lake sal 0.09
15 752 DR-3 NaN 752 lake temp -16.00
16 752 DR-3 NaN 752 roe sal 41.60
17 837 MSK-4 1932-01-14 837 lake rad 1.46
18 837 MSK-4 1932-01-14 837 lake sal 0.21
19 837 MSK-4 1932-01-14 837 roe sal 22.50
20 844 DR-1 1932-03-22 844 roe rad 11.25