7_판다스3
import warnings
warnings.filterwarnings('ignore')
from IPython.display import Image
import numpy as np
import pandas as pd
#분석하기 좋은 데이터
#분석하기 좋은 데이터는 데이터 집합을 분석하기 좋은 형태로 만들어 놓은 것을
#말하고 데이터 분석 단계에서 데이터 정리는 아주 중요한 작업으로 실제 데이터
#분석 작업의 70% 이상을 차지하고 있는 작업이 데이터 정리 작업이다.
#=> 데이터 전처리
#분석하기 좋은 데이터는 데이터 분석 목적에 맞는 데이터를 모아 표(table)를
#만들어야 하고 측정한 값은 행으로 변수는 열로 구성을 하며 이 조건을 만족하는
#데이터를 깔끔한 데이터(Tidy Data)라고 부른다.
df1 = pd.read_csv('./data/concat_1.csv')
df1
A | B | C | D | |
---|---|---|---|---|
0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
df2 = pd.read_csv('./data/concat_1.csv')
df2
A | B | C | D | |
---|---|---|---|---|
0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
df3 = pd.read_csv('./data/concat_1.csv')
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 |
#concat()함수는 연결하려는 데이터프레임을 리스트에 담아서 전달하면
#연결된 데이터프레임으로 변환한다.
#=>두개 이상 연결할 때 concat([데이터프레임1, 데이터프레임2, .....])
#데이터프레임을 연결할 때 기본값으로 위에서 아래 방향으로 연결되고
#df1,df2,df3은 열 이름이 모두 A,B,C,D로 같고 데이터프레임을 연결한
#다음에도 열이 그대로 유지되고 인덱스도 유지된다.
#row_concat = pd.concat([df1,df2,df3], axis=0)
row_concat = pd.concat([df1,df2,df3])
row_concat
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 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 |
#데이터프레임에 시리즈 연결하기
new_row_series=pd.Series(['n1', 'n2', 'n3', 'n4'])
new_row_series
0 n1
1 n2
2 n3
3 n4
dtype: object
#시리즈가 새로운 행으로 추가되지 않고 새로운 열로 추가된다.
#=>NaN을 누락값(결축치)이라 부른다.
#시리즈에 열 이름이 없기 때문에 시리를 데이터프레임에 새로운
#행으로 추가혈 해도 제대로 추가되지 않는다.
#새로운 시리즈를 새로운 열로 간주해서 '0'이라는 이름의
#열로 추가한다.
pd.concat([df1,new_row_series ])
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 |
#행이 한개인 데이터프레임을 생성해서 df1에 추가한다.
#데이터프레임을 만드는 DataFrame()함수로 데이터프레임을
#구성하려는 데이터는 반드시 전체를 리스트로 묶어 전달해야 한다.
#데이터프레임으로 구성할 데이터를 리스트로 묶어서 전달하지 않으면
#데이터 하나하나를 개별 데이터로 취급해서 행 단위의 데이터프레임이
#생성되지 않고 열 단위의 데이터프레임이 생성된다.
new_row_df = pd.DataFrame(['n1', 'n2', 'n3', 'n4']) # 열 단위의 데이터프레임이 생성된다.
new_row_df
0 | |
---|---|
0 | n1 |
1 | n2 |
2 | n3 |
3 | n4 |
pd.concat([df1, new_row_df])
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 |
new_row_df2 = pd.DataFrame([['n1', 'n2', 'n3', 'n4']]) # 행 단위의 데이터프레임이 생성된다.
new_row_df2
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | n1 | n2 | n3 | n4 |
# 열 이름을 지정하지 않으면 판다스가 '0', '1', '2', '3'과 같은 방식으로 열 이름을 붙여주기 때문에 columns 속성을 사용해서
# 데이터프레임 생성시 열 이름을 지정해야 한다.
print(list(new_row_df2.columns))
new_row_df2 = pd.DataFrame([['n1', 'n2', 'n3', 'n4']], columns=['A', 'B', 'C', 'D'])
print(list(new_row_df2.columns))
[0, 1, 2, 3]
['A', 'B', 'C', 'D']
pd.concat([df1, new_row_df2])
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 |
new_row_df3 = pd.DataFrame([['n1', 'n2', 'n3', 'n4']])
new_row_df3
0 | 1 | 2 | 3 | |
---|---|---|---|---|
0 | n1 | n2 | n3 | n4 |
# columns 속성만 사용하면 데이터프레임의 열 이름을 얻어오는 기능을 실행한다.
print(list(new_row_df3.columns))
# 데이터프레임의 columns 속성만 사용하면 데이터프레임의 열 이름을 얻어오지만 columns 속성에 리스트로 묶인 열 이름을 전달하면
# 데이터프레임의 열 이름을 변경할 수 있다.
new_row_df3.columns = ['A', 'B', 'C', 'D']
print(list(new_row_df3.columns))
[0, 1, 2, 3]
['A', 'B', 'C', 'D']
pd.concat([df1, new_row_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 |
0 | n1 | n2 | n3 | n4 |
# concat() 함수로 데이터프레임을 연결할 때 axis=1로 지정하면 왼쪽에서 오른쪽으로 합치기가 실행된다.
col_concat = pd.concat([df1, df2, df3], axis=1)
col_concat
A | B | C | D | A | B | C | D | A | B | C | D | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 |
col_concat.columns
Index(['A', 'B', 'C', 'D', 'A', 'B', 'C', 'D', 'A', 'B', 'C', 'D'], dtype='object')
# 같은 열 이름이 있는 데이터프레임에서 열 이름으로 데이터를 추출하면 해당 열 이름의 데이터를 모두 추출한다.
col_concat['A']
A | A | A | |
---|---|---|---|
0 | a0 | a0 | a0 |
1 | a1 | a1 | a1 |
2 | a2 | a2 | a2 |
3 | a3 | a3 | a3 |
# concat() 함수에 ignore_index=True 옵션을 지정하면 기존 열 이름을 무시하고 0부터 1씩 증가하면서 열 이름이 다시 부여된다.
col_concat = pd.concat([df1, df2, df3], axis=1, ignore_index=True)
col_concat
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 |
col_concat.columns = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']
col_concat
A | B | C | D | E | F | G | H | I | J | K | L | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 |
2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 |
3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 |
# 데이터프레임['열이름'] = [리스트] 형태로 실행하면 간편하게 새로운 열을 추가할 수 있다.
col_concat['new_col_list'] = ['n1', 'n2', 'n3', 'n4']
col_concat
A | B | C | D | E | F | G | H | I | J | K | L | new_col_list | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 | n1 |
1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 | a1 | b1 | c1 | d1 | n2 |
2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 | a2 | b2 | c2 | d2 | n3 |
3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 | a3 | b3 | c3 | d3 | n4 |
# concat() 함수는 한 번에 2개 이상의 데이터프레임을 연결하는 함수이다. 만약 연결할 데이터프레임이 1개라면 append() 함수를
# 사용하면 된다.
#df2 = pd.read_csv('./data/concat_1.csv')
#new_row_df3 = pd.DataFrame([['n1', 'n2', 'n3', 'n4']])
df2.append(new_row_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 |
0 | n1 | n2 | n3 | n4 |
# concat(), append() 함수를 사용해서 데이터프레임을 연결할 때 인덱스를 다시 부여하려면 ignore_index 옵션을 사용한다.
# ignore_index 옵션은 생략시 기본값이 False이고 기존 인덱스가 유지되지만 True로 지정하면 기존 인덱스가 무시되고 0부터 1씩 증가
# 하면서 다시 부여된다.
df2.append(new_row_df3, 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 |
# append() 함수에 딕셔너리를 사용하면 데이터를 판다스 데이터프레임으로 구성하지 않고도 데이터프레임에 추가할 수 있다.
# 데이터프레임.append(추가할 데이터가 저장된 딕셔너리)
data_dict = {'A': 'n5', 'B': 'n6', 'C': 'n7', 'D': 'n8'}
print(data_dict)
# append() 함수로 딕셔너리를 데이터프레임에 추가하려면 딕셔너리는 데이터프레임을 구성하는 인덱스가 없으므로 ignore_index=True
# 옵션을 지정해서 인덱스를 다시 부여해야 에러가 발생되지 않는다.
#df3.append(data_dict) # 에러
df3.append(data_dict, ignore_index=True)
{'A': 'n5', 'B': 'n6', 'C': 'n7', 'D': 'n8'}
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 | n5 | n6 | n7 | n8 |
#join속성을 'inner'로 지정해서 데이터프레임의 공통 열만
#골라 연결하면 누락값이 생기지 않는다.
#join 속성의 기본값은 'outer'로 공통연결 여부와 상관없이
#연결한다.
print(df1.columns)
df2.columns = ['E', 'F', 'G', 'H']
print(df2.columns)
df3.columns = ['A', 'C', 'F', 'H']
print(df3.columns)
Index(['A', 'B', 'C', 'D'], dtype='object')
Index(['E', 'F', 'G', 'H'], dtype='object')
Index(['A', 'C', 'F', 'H'], dtype='object')
row_concat = pd.concat([df1, df2, df3])
row_concat
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 | a0 | b0 | c0 | d0 |
1 | NaN | NaN | NaN | NaN | a1 | b1 | c1 | d1 |
2 | NaN | NaN | NaN | NaN | a2 | b2 | c2 | d2 |
3 | NaN | NaN | NaN | NaN | a3 | b3 | c3 | d3 |
0 | a0 | NaN | b0 | NaN | NaN | c0 | NaN | d0 |
1 | a1 | NaN | b1 | NaN | NaN | c1 | NaN | d1 |
2 | a2 | NaN | b2 | NaN | NaN | c2 | NaN | d2 |
3 | a3 | NaN | b3 | NaN | NaN | c3 | NaN | d3 |
#df1, df2, df3 데이터프레임은 3개 모두 공통열(하나라도 비지 않은 열)이
#없기 때문에 빈 데이터프레임이 출력된다(인덱스만 나온다.).
row_concat = pd.concat([df1, df2, df3], join='inner')
row_concat
0 |
---|
1 |
2 |
3 |
0 |
1 |
2 |
3 |
0 |
1 |
2 |
3 |
#df1, df3데이터프레임은 2개 모두 공통 열이 있기 때문에
#공통 열을 연결한다.
#=>A,C열이 공통 열로 연결된다.
pd.concat([df1, df3], join='inner')
A | C | |
---|---|---|
0 | a0 | c0 |
1 | a1 | c1 |
2 | a2 | c2 |
3 | a3 | c3 |
0 | a0 | b0 |
1 | a1 | b1 |
2 | a2 | b2 |
3 | a3 | b3 |
#df1, df3데이터프레임은 2개 모두 공통 열이 있기 때문에
#공통 열을 연결한다.
#=>F,H열이 공통 열로 연결된다.
pd.concat([df2, df3], join='inner')
F | H | |
---|---|---|
0 | b0 | d0 |
1 | b1 | d1 |
2 | b2 | d2 |
3 | b3 | d3 |
0 | c0 | d0 |
1 | c1 | d1 |
2 | c2 | d2 |
3 | c3 | d3 |
print(df1.index)
print(list(df1.index))
#데이터프레임의 인덱스를 변경하려면
#데이터프레임의 index 속성에 새 인덱스를
#리스트로 전달하면 된다.
df2.index = [4,5,6,7]
print(list(df2.index))
df3.index = [0,2,5,6]
print(list(df3.index))
RangeIndex(start=0, stop=4, step=1)
[0, 1, 2, 3]
[4, 5, 6, 7]
[0, 2, 5, 6]
col_concat = pd.concat([df1, df2, df3], axis= 1)
col_concat
A | B | C | D | E | F | G | H | A | C | F | H | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | NaN | NaN | NaN | NaN | a0 | b0 | c0 | d0 |
1 | a1 | b1 | c1 | d1 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
2 | a2 | b2 | c2 | d2 | NaN | NaN | NaN | NaN | a1 | b1 | c1 | d1 |
3 | a3 | b3 | c3 | d3 | NaN | NaN | NaN | NaN | NaN | NaN | NaN | NaN |
4 | NaN | NaN | NaN | NaN | a0 | b0 | c0 | d0 | NaN | NaN | NaN | NaN |
5 | NaN | NaN | NaN | NaN | a1 | b1 | c1 | d1 | a2 | b2 | c2 | d2 |
6 | NaN | NaN | NaN | NaN | a2 | b2 | c2 | d2 | a3 | b3 | c3 | d3 |
7 | NaN | NaN | NaN | NaN | a3 | b3 | c3 | d3 | NaN | NaN | NaN | NaN |
#df1, df2, df3 데이터프레임은 3개 모두
#공통인덱스가 없으므로 빈 데이터프레임이
#출력된다.
pd.concat([df1, df2, df3], axis= 1, join="inner")
A | B | C | D | E | F | G | H | A | C | F | H |
---|
#df1, df3 데이터프레임은 2개 모두 공통 인덱스가
#있으므로 공통 인덱스를 연결한다.
#=>0,2행이 공통 행으로 연결된다.
pd.concat([df1,df3], axis= 1, join="inner")
A | B | C | D | A | C | F | H | |
---|---|---|---|---|---|---|---|---|
0 | a0 | b0 | c0 | d0 | a0 | b0 | c0 | d0 |
2 | a2 | b2 | c2 | d2 | a1 | b1 | c1 | d1 |
#df2, df3 데이터프레임은 2개 모두 공통 인덱스가
#있으므로 공통 인덱스를 연결한다.
#=>5,6행이 공통 행으로 연결된다.
pd.concat([df2,df3], axis= 1, join="inner")
E | F | G | H | A | C | F | H | |
---|---|---|---|---|---|---|---|---|
5 | a1 | b1 | c1 | d1 | a2 | b2 | c2 | d2 |
6 | a2 | b2 | c2 | d2 | a3 | b3 | c3 | d3 |
# survey_person.csv => 관측한 사람
# survey_site.csv => 관측 위치
# survey_survey.csv => 날씨 정보
# survey_visited.csv => 관측 날짜
person = pd.read_csv('./data/survey_person.csv')
person
ident | personal | family | |
---|---|---|---|
0 | dyer | William | Dyer |
1 | pb | Frank | Pabodie |
2 | lake | Anderson | Lake |
3 | roe | Valentina | Roerich |
4 | danforth | Frank | Danforth |
site = pd.read_csv('./data/survey_site.csv')
site
name | lat | long | |
---|---|---|---|
0 | DR-1 | -49.85 | -128.57 |
1 | DR-3 | -47.15 | -126.72 |
2 | MSK-4 | -48.87 | -123.40 |
survey = pd.read_csv('./data/survey_survey.csv')
survey
taken | person | quant | reading | |
---|---|---|---|---|
0 | 619 | dyer | rad | 9.82 |
1 | 619 | dyer | sal | 0.13 |
2 | 622 | dyer | rad | 7.80 |
3 | 622 | dyer | sal | 0.09 |
4 | 734 | pb | rad | 8.41 |
5 | 734 | lake | sal | 0.05 |
6 | 734 | pb | temp | -21.50 |
7 | 735 | pb | rad | 7.22 |
8 | 735 | NaN | sal | 0.06 |
9 | 735 | NaN | temp | -26.00 |
10 | 751 | pb | rad | 4.35 |
11 | 751 | pb | temp | -18.50 |
12 | 751 | lake | sal | 0.10 |
13 | 752 | lake | rad | 2.19 |
14 | 752 | lake | sal | 0.09 |
15 | 752 | lake | temp | -16.00 |
16 | 752 | roe | sal | 41.60 |
17 | 837 | lake | rad | 1.46 |
18 | 837 | lake | sal | 0.21 |
19 | 837 | roe | sal | 22.50 |
20 | 844 | roe | rad | 11.25 |
visited = pd.read_csv('./data/survey_visited.csv')
visited
ident | site | dated | |
---|---|---|---|
0 | 619 | DR-1 | 1927-02-08 |
1 | 622 | DR-1 | 1927-02-10 |
2 | 734 | DR-3 | 1939-01-07 |
3 | 735 | DR-3 | 1930-01-12 |
4 | 751 | DR-3 | 1930-02-26 |
5 | 752 | DR-3 | NaN |
6 | 837 | MSK-4 | 1932-01-14 |
7 | 844 | DR-1 | 1932-03-22 |
from IPython.display import Image
#merge()함수는 기본적으로 내부(inner) 조인을 실행하며
#함수를 실행한 데이터프레임이 왼쪽(left_on)으로 지정되고
#첫번째 인수로 지정된 데이터프레임이 오른쪽(right_on)으로
#지정되며 left_on, right_on속성은 각각 왼쪽과 오른쪽
#데이터프레임에서 일치해야할 열을 지정한다.
print(site.columns)
print(visited.columns)
site
visited
s2v_merge = site.merge(visited, left_on='name', right_on='site')
s2v_merge
Index(['name', 'lat', 'long'], dtype='object')
Index(['ident', 'site', 'dated'], dtype='object')
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 |
print(person.columns)
print(survey.columns)
p2s_merge = person.merge(survey, left_on='ident', right_on='person')
p2s_merge
Index(['ident', 'personal', 'family'], dtype='object')
Index(['taken', 'person', 'quant', 'reading'], dtype='object')
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 |
v2s_merge = visited.merge(site, left_on='site', right_on='name')
v2s_merge
print(p2s_merge.columns)
print(v2s_merge.columns)
#중복되는 열 이름에는 _x. _y가 추가된다.
#_x는 왼쪽 데이터프레임을, _y는 오른쪽
#데이터프레임의 열 이름을 의미한다.
#p2s_v2s_merge = p2s_merge.merge(v2s_merge, left_on=['ident', 'taken', 'quant'], right_on=['person', 'ident', 'quant'])
p2s_v2s_merge = p2s_merge.merge(v2s_merge, left_on=['taken'], right_on=['ident'])
p2s_v2s_merge
Index(['ident', 'personal', 'family', 'taken', 'person', 'quant', 'reading'], dtype='object')
Index(['ident', 'site', 'dated', 'taken', 'person', 'quant', 'reading'], dtype='object')
ident_x | personal | family | taken_x | person_x | quant | reading_x | ident_y | site | dated | taken_y | person_y | reading_y | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | dyer | William | Dyer | 619 | dyer | rad | 9.82 | 619 | DR-1 | 1927-02-08 | 619 | dyer | 9.82 |
1 | dyer | William | Dyer | 619 | dyer | sal | 0.13 | 619 | DR-1 | 1927-02-08 | 619 | dyer | 0.13 |
2 | dyer | William | Dyer | 622 | dyer | rad | 7.80 | 622 | DR-1 | 1927-02-10 | 622 | dyer | 7.80 |
3 | dyer | William | Dyer | 622 | dyer | sal | 0.09 | 622 | DR-1 | 1927-02-10 | 622 | dyer | 0.09 |
4 | pb | Frank | Pabodie | 734 | pb | rad | 8.41 | 734 | DR-3 | 1939-01-07 | 734 | pb | 8.41 |
5 | pb | Frank | Pabodie | 734 | pb | temp | -21.50 | 734 | DR-3 | 1939-01-07 | 734 | pb | -21.50 |
6 | pb | Frank | Pabodie | 735 | pb | rad | 7.22 | 735 | DR-3 | 1930-01-12 | 735 | pb | 7.22 |
7 | pb | Frank | Pabodie | 751 | pb | rad | 4.35 | 751 | DR-3 | 1930-02-26 | 751 | pb | 4.35 |
8 | pb | Frank | Pabodie | 751 | pb | temp | -18.50 | 751 | DR-3 | 1930-02-26 | 751 | pb | -18.50 |
9 | lake | Anderson | Lake | 734 | lake | sal | 0.05 | 734 | DR-3 | 1939-01-07 | 734 | lake | 0.05 |
10 | lake | Anderson | Lake | 751 | lake | sal | 0.10 | 751 | DR-3 | 1930-02-26 | 751 | lake | 0.10 |
11 | lake | Anderson | Lake | 752 | lake | rad | 2.19 | 752 | DR-3 | NaN | 752 | lake | 2.19 |
12 | lake | Anderson | Lake | 752 | lake | sal | 0.09 | 752 | DR-3 | NaN | 752 | lake | 0.09 |
13 | lake | Anderson | Lake | 752 | lake | temp | -16.00 | 752 | DR-3 | NaN | 752 | lake | -16.00 |
14 | lake | Anderson | Lake | 837 | lake | rad | 1.46 | 837 | MSK-4 | 1932-01-14 | 837 | lake | 1.46 |
15 | lake | Anderson | Lake | 837 | lake | sal | 0.21 | 837 | MSK-4 | 1932-01-14 | 837 | lake | 0.21 |
16 | roe | Valentina | Roerich | 752 | roe | sal | 41.60 | 752 | DR-3 | NaN | 752 | roe | 41.60 |
17 | roe | Valentina | Roerich | 837 | roe | sal | 22.50 | 837 | MSK-4 | 1932-01-14 | 837 | roe | 22.50 |
18 | roe | Valentina | Roerich | 844 | roe | rad | 11.25 | 844 | DR-1 | 1932-03-22 | 844 | roe | 11.25 |
댓글남기기