2020년 3월 19일 목요일

Day_00. Intro_04

Pandas concatenation
-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의 원소를 이어 붙힌다

Dataframe 의 축변환, (axis parameter를 이용하기)

-np.concatenate([x,x],axis=0)
--array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])

-np.concatenate([x,x],axis=1)
--array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
--axis 가 0일때는 아래로 데이터를 연결, 1일때는 옆으로 이어붙힌다

Pandas 의 Merge
--공통된 항목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

--pandas 에서는 concat 키워드를 사용해서 데이터를 붙힌다
--이때 index 가 이름이 중복되어있어도 상관없이 붙히는 것을 알수있음
--concat 된 데이터에 접근할 때 index의 이름을 1로 지정하면 같은 index로 지정된 데이터가 나옴


Merge- 다른 column 이름이나 원소의 개수가 같을 때 사용한다
--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]})

display(df1,df2)

pd.merge(df1,df2)

--2개의 dataframe 을 merge 한다
---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)

--drop을 이용해서 중복되는 column을 제거하고 axis=1을 이용한다, 이때 axis를 사용하지 않으면 에러가 발생한다


Index를 따로 이름을 지정해서 표시하기
df1a=df1.set_index('employee')
df2a=df2.set_index('employee')
display(df1a,df2a)

이 상황에서 merge는 어떻게 해야할까?
--pd.merge(df1a,df2a)
#두개의 dataframe 은 공통된 column이 없어서 merge가 작동하지 않음

pd.merge(df1a, df2a, left_index=True, right_index=True)
--left_index , right_index




댓글 없음:

댓글 쓰기