코딩하는 타코야끼

[Pandas] 5강_Pandas_DataFrame_합치기 본문

[T.I.L] : Today I Learned/Pandas

[Pandas] 5강_Pandas_DataFrame_합치기

가스오부시 2023. 4. 24. 19:59
728x90
반응형

1. 데이터프레임 합치기

  • 두개 이상의 DataFrame을 합쳐 하나의 DataFrame으로 만든다.
  • inner join
    • 행이 같아야 join 가능.
  • outer join
    • 행이 같지 않아도 join 가능.(단, 행의 값이 맞지 않으면 Nan output)

📍 수직결합

  • 단순결합으로 여러개의 DataFrame들의 같은 컬럼끼리 수직으로 합친다.


📍 수평결합

  • 연관성 있는 여러 데이터를 하나로 합쳐서 조회하는 JOIN 처리를 한다.
  • 합치려는 DataFrame의 index 나 특정 컬럼의 값이 같은 행 끼리 합친다. !중요!


📍 데이터셋 읽기

  • stocks_2016.csv, stocks_2017.csv, stocks_2018.csv : 년도별 보유 주식
  • stocks_info.csv : 주식 정보

📍 concat() 이용

  • 수직, 수평 결합 모두 지원한다.
  • 하나의 데이터셋을 여러 DataFrame으로 나눈 것을 하나의 DataFrame으로 합칠 때 사용한다.

🌓 수직 결합 (행이 늘어나도록 합친다.)

  • 컬럼명이 같은 열끼리 합친다.
  • 같은 column 명이 없는 열들도 결과 DataFrame에 들어간다.(default)
    • full outer join개념

🌓 수평 결합(열이 늘어나도록 합친다.)

  • index명이 같은 행 끼리 합친다. (equi-join)
  • 같은 index명이 없는 행들도 결과 DataFrame에 들어간다.(default)
    • full outer join
pd.concat([stock_2016, stock_2017, stock_2018],
         axis = 1,# 수평결합 - 1번 축 방향으로 합친다. => 행 index이름이 같은 것 끼리 합니다.
         join = 'inner') # 양쪽에 모두 있는 것들만 붙인다. = > inner

result2 = pd.concat([stock_2016, stock_2017, stock_2018],ignore_index=True)
# 'ignore_index=True'는 대상 dataframe들의 index이름은 무시하고(버리고) 붙인다.
#  ==> index명은 0 ~ 1씩 자동증가하는 값으면 변경.
result2

result3 = pd.concat([stock_2016, stock_2017, stock_2018], keys = ['2016년', '2017년', '2018년'])
 #각각의 DataFrame을 구분할 수 있는 index를 추가한다.(멀티 index)
result3

result3.loc['2016년'] # 2016년 DataFrame 추출 가능.
result3.loc[('2018년',0)] # 2018년의 0번 인덱스 추출.
>>>
# 2018 추출 값
Symbol    AAPL
Shares      40
Low        135
High       170
Name: (2018년, 0), dtype: object

🌓 pd.concat(objs, [, key=리스트]), axis=0, join='outer' )

  • 매개변수
    • objs: 합칠 DataFrame들을 리스트로 전달
    • keys=[] 를 이용해 합친 행들을 구분하기 위한 다중 인덱스 처리
    • axis
      • 0 또는 index : 수직결합
      • 1 또는 columns : 수평결합
    • join:
      • 합치는 방식으로 다음 문자열을 값으로 설정한다.
        • 'outer'(기본값): full outer join
        • 'inner': inner join (동일한 index명, column명 끼리 합친다.)


📍 조인을 통한 DataFrame 합치기

  • 연관성있는 둘 이상의 DataFrame을 하나로 합친다.
    • ex) 고객과 주문정보, 교수와 수업정보, 직원과 부서정보
  • join()
    • 2개 이상의 DataFrame을 조인할 때 사용
  • merge()
    • 2개의 DataFrame의 조인만 지원

🌓  join( )

  • dataframe객체.join(others, how='left', lsuffix='', rsuffix='')
  •  df_A.join(df_b) df_A.join([df_b, df_c, df_d]) 
  • 두개 이상의 DataFrame들을 조인 할 수 있다.
    • 조인 기준: index가 같은 값인 행끼리 합친다. (equi-join)
    • 조인 기본 방식: Left Outer Join - 'left'dataframe' 이 기준
  • 매개변수
    • lsuffix, rsuffix
      • 조인 대상 DataFrame에 같은 이름의 컬럼이 있으면 에러 발생.
      • 같은 이름이 있는 경우 붙일 접미어 지정
    • how :조인방식. 'left', 'right', 'outer', 'inner'. left가 기본
stock_info.join(stock_2017, lsuffix = '_info', rsuffix = '_2016')
# 행 index 이름이 같은 행끼리 join => 이 데이터프레임들은 Symbol 컬럼값이 같은 행끼리 join 해야된다.

join_df = stock_info.set_index('Symbol').join(stock_2017.set_index('Symbol'),how = 'inner')
 #inner join

stock_2017.set_index('Symbol').join(stock_info.set_index('Symbol'),how = 'right')
# right outer join (stock_info의 모든 행이 다 join 된다.)

stock_2016.add_suffix("_접미어") # 뒤에 붙는 명령어
stock_2016.add_prefix('접두어_') # 앞에 붙는 명령어

🌓 merge( )

  • inner 방식이 이 기본방식이다.
  •  df_a.merge(df_b) 
  • 두개의 DataFrame간의 조인만 가능하다.
    • 조인 기준
      • 같은 컬럼명을 기준으로 equi-join을 하는 것이 기본이다.
      • 조인기준을 다양하게 정할 수 있다.
        • 컬럼, index등을 기준으로 같은 행끼리 join 하도록 설정할 수 있다.
    • 조인 기본 방식
      • inner join
      • how 매개변수를 이용해 변경이 가능하다.
  •  dataframe.merge(합칠dataframe, how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False) 
  • 매개변수
    • on : 같은 컬럼명이 여러개일때 join 대상 컬럼을 선택
    • right_on, left_on : 조인할 때 사용할 왼쪽,오른쪽 Dataframe의 컬럼명.
    • left_index, right_index: 조인 할때 index를 사용할 경우 True로 지정
    • how : 조인 방식. 'left', 'right', 'outer', 'inner'. 기본: inner
    • suffixes: 두 DataFrame에 같은 이름의 컬럼명이 있을 경우 구분을 위해 붙인 접미어를 리스트로 설정
      • 생략시 x, y를 붙인다.
  • 하나의 데이터셋을 어떤 특정행 또튼 특정열을 기준으로 단순해 분리 한 경우를 합치는 경우 concat() 사용
    • 수직 결합일 경우는 concat()을 사용해야 한다.
  • 서로 연관성 있는 다른 데이터셋을 결합해서 보는 경우 join(), merge()를 사용한다. (Join)
    • 두 개 이상의 DataFrame을 조인할 때는 하는 경우 : join() 사용
    • 두개의 DataFrame을 조인할 때는 merge() 를 사용한다. => 컨트롤이 편하다.
stock_2016.merge(stock_info, how = 'right') # 같은 컬럼명(Symbol)의 값을 기준으로 join
stock_info.merge(stock_2016, how = 'left') # join 방식: inner join

stock_info.merge(stock_2016_2,
                 left_on = 'Symbol', # 왼쪽 (stock_info) 에서는 Symbol 컬럼을 join 기준.
                 right_index = True) # 오른쪽(stock_2016_2) 에서는 index 이름을 join 기준.

stock_2016_2.merge(stock_info, left_index = True, right_on = "Symbol")

# 같은 이름의 컬럼이 여러개 일때 Join 기준 컬럼을 일부만 선택할떄 on을 사용.
stock_2016.merge(stock_2018, on = 'Symbol', suffixes=['_2016','_2018'])

반응형