-pandas 에서 data frame의 combine 방법론
-기존 data에 새로운 data를 추가해서 붙히는 방법
-다른 데이터 소스에서의 데이터 병합, ex)quendl 과 yahoo 데이터등을 합칠 때
**암기가 아닌 응용력이 중요, 어떤 상황에서 어떤 문법을 사용할지 선택 하는게 중요**
import pandas as pd
import numpy as np
--x=[1,2,3]
--y=[4,5,6]
--np.concatenate([x,y]) ---array([1, 2, 3, 4, 5, 6]) #concatenate 를 full 로 작성해준다
**numpy에서는 concatenate 로 작성한다**
x=np.arange(1,7).reshape(2,3)
z=np.array([7,8,9]
---x를 1~6까지 2행 3열로 생성, z는 단일행 행렬로 7,8,9를 지정
np.vstack([x,z])
---array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
----vstack 을 이용해 x의 행렬 인 2행 3열에 맞게 z의 원소를 이어 붙힌다
-np.concatenate([x,x],axis=0)
--array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
--array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
--axis 가 0일때는 아래로 데이터를 연결, 1일때는 옆으로 이어붙힌다
--공통된 항목ex)column name 이 있을 때 사용하기
--index 값으로의 concat 은 merge 기능이 좋다
x1=pd.Series(['A','B','C'],index=list('123'))
x2=pd.Series(['D','E','F'],index=list('123'))
x3=pd.concat([x1,x2])
x3
1 A
2 B
3 C
1 D
2 E
3 F
x3['1']
1 A
1 D
--이때 index 가 이름이 중복되어있어도 상관없이 붙히는 것을 알수있음
--concat 된 데이터에 접근할 때 index의 이름을 1로 지정하면 같은 index로 지정된 데이터가 나옴
--2개의 DataFrame 을 생성해서 merge 하기
df1=pd.DataFrame({'employee':['Bob','Jake','Lisa','Sue'],
'group':['Accounting','Engineering','Engineering','HR']})
df2=pd.DataFrame({'employee':['Lisa','Bob','Jake','Sue'],
'hire_date':[2004,2008,2012,2014]})
---pd.merge(df1,df2 , on='employee')
---이때 merge의 기준이 되는 column을 적어주면 혼잡도를 줄일수 있다
SQL 에서 Left outer join 기능 효과
df1=pd.DataFrame({'employee':['Bob','Jake','Lisa','Sue'],
'group':['Accounting','Engineering','Engineering','HR']})
df2=pd.DataFrame({'name':['Lisa','Bob','Jake','Sue'],
'salary':[10000,20000,30000,40000]})
display(df1,df2)
--dataframe 의 column이름이 다르고 추가된 항목도 있음
--2개의 dataframe 을 동시에 보기위해서 어떤 merge를 해야할까?
--pd.merge(df1,df2, left_on='employee',right_on='name')
문제점이 있는데 employee와 name 은 column이름만 다르고 내부 data는 같다
--pd.merge(df1,df2, left_on='employee',right_on='name').drop('name',axis=1)
df1a=df1.set_index('employee')
df2a=df2.set_index('employee')
display(df1a,df2a)
--pd.merge(df1a,df2a)
#두개의 dataframe 은 공통된 column이 없어서 merge가 작동하지 않음
pd.merge(df1a, df2a, left_index=True, right_index=True)
--left_index , right_index
pd.merge(df1a, df2a, left_index=True, right_index=True)
--left_index , right_index
댓글 없음:
댓글 쓰기