[Python] DataFrame

wooaeng·2025년 10월 28일

Python

목록 보기
3/8

DataFrame 개요

  • 표를 다루는 Pandas의 타입
    • Database의 Table이나 Excel 표와 동일한 역할
  • 행(row)와 열(column)으로 구성
  • 각 행과 열은 순번, 이름 두 가지 종류의 식별자를 가짐
  1. 순번
  • 양수 index, 음수 index 두 종류
  • 컬럼도 순번으로 관리되나 조회 시 사용은 불가
  1. 이름
  • 명시적으로 지정한 행과 열의 이름을 의미
  • 행의 이름 = index name, 열의 이름 = column name
  • 이름을 별도 명시하지 않는 경우 양수 순번이 행과 열의 이름으로 설정됨

DataFrame 생성

pd.DataFrame(data [, index=None, colmns=None])

  • Data
    • DataFrame을 구성한 값들이 담긴 변수 (보통 변수에 값을 담아 입력)
    • Series, List, ndarray를 담은 2차원 배열의 형태를 가짐
    • 열 이름을 key, 값을 value로 하는 딕셔너리
  • index : index명으로 사용할 값의 배열
  • columns : 컬럼명으로 사용할 값의 배열
	# 학생들의 시험 점수를 담은 DataFrame을 만들어보자
    
    import pandas as pd
    # pandas의 alias(별칭)은 관례적으로 pd 사용
    
    g = {
    "number":["student-"+str(i) for i in range(1, 11)],
    "국어":[100, 83, 92, 75, 80, 93, 87, 67, 71, 59],
    "수학":[78, 67, 92, 100, 95, 67, 82, 98, 75, 100]
    }
    grade = pd.DataFrame(g)

DataFrame에 저장된 값들을 파일로 저장

  • csv 파일   * import os 필요
    DataFrame 객체.to_csv(파일경로, sep=[구분자], index=[True/Flase], header=[True/Flase])
	# 양수 index name, colum name 저장 안 함
	grade.to_csv("save_data/grade.csv",
    			index=False, header=False)
                
    # 양수 index name, colum name 저장함, 미입력 시 기본값 True
    grade.to_csv("save_data/grade.csv",
    			index=True, header=True)
                
    # 양수 index name, colum name 저장함, 구분자 "\t", 미입력 시 기본값 ","
    grade.to_csv("save_data/grade.csv", sep="\t")
  • 엑셀로 저장
    DataFrame 객체.to_csv(파일경로, index=[True/Flase], header=[True/Flase])

  • Database Table에 저장
    DataFrame 객체.to_csv(파일경로, index=[True/Flase], header=[True/Flase])

    import pandas as pd
    from sqlalchemy import create_engine	# 모듈 필요

    user = "[sql user 이름]"
    password = "[sql pw]"
    host = "localhost"
    port = 3306
    database = "[값을 추가할 database명]"
    
    conn_str = f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}"
    
    # DB 연결
    engine = create_engine(conn_str)
    
    # 데이터 insert (append 모드)
    grade.to_sql(
    name="grade",         # 값을 넣을 Table명
    con=engine,           # connection
    if_exists="append",   # 테이블 존재 시 데이터 추가,
    						"replace": 테이블 삭제후 다시 생성
                            "fail": 테이블이 있으면 에러
    index=False           # index는 저장하지 않음
)
  • 기타 형식
    • pickle grade.to_pickle("saved_data/grade.pickle")
    • html grade.to_html("saved_data/grade.html")
    • json grade.to_json("saved_data/grade.json")
    • html 가능함

파일로부터 데이터셋을 읽어와 생성

  • 텍스트 파일로부터 읽어와 생성
    `pd.read_csv(파일경로, sep='[구분자]', header= , index_col= , na_values= )
    • 파일경로: 읽어올 파일의 경로
    • sep: 구분자, 기본값 comma
    • header: 컬럼명으로 사용할 행 지정, 기본값 첫 번째 행, None으로 지정할 경우 파일의 첫 번째 행부터 값으로 사용하고 컬럼명은 0부터 자동증가하는 값 입력
    • index_col: index명으로 사용할 열 이름이나 순번 지정, 생략 시 0부터 자동증가하는 양수 index 입력
    • na_values: 결측치로 처리할 문자열 지정
   a = pd.read_csv(
   "data/abc1.csv",
   sep=",",
   header=0)
   
   a

Index 이름 처리

DataFrame객체.set_index(컬럼 이름, inplace= )

  • 특정 컬럼을 행의 index명으로 사용
  • 해당 컬럼이 index명으로 바뀌므로 Data set에서는 제거됨
  • inplace : 원본 변경 여부, True/False로 입력

DataFrame객체.reset_index(drop=False, inplace= )

  • index를 첫 번째 컬럼으로 복원
  • drop=True > 기존의 index name 삭제하고 자동증가하는 양수 index 입력
  • drop=False > 기존의 index name 유지(오른쪽으로 밀어냄)하고 자동증가하는 양수 index 입력

컬럼 이름/행 이름 조회 및 변경

조회

  • 컬럼명 조회 DataFrame객체.colums
    • 차후 조회를 위해 따로 변수에 저장하는 것이 좋음
  • 행명 조회 DataFrame객체.index

변경 DataFrame객체.colums = ['새 이름', '새 이름', ..., '새이름]

  • 위 형태에서는 colums와 index 전체를 한 번에 변경하는 것만 가능
  • 일부만 선택해서 변경하는 것은 불가능(= 별도 method 이용)

method 이용
DataFrame객체.rename(index={"기존 이름":"변경할 이름"},
colunms={"기존 이름":"변경할 이름"}, inplace= )

  • 개별 컬럼 이름, 행 이름을 변경하는 method
  • 변경한 DataFrame을 반환
  • 변경에 관한 정보 위치에는 기존 이름과 변경할 값을 딕셔너리 형태로 담은 변수를 사용하는 것이 좋음
  • inplace : 원본 변경 여부, True/False로 입력

삭제
DataFrame객체.drop(colums= , index= , inplace= )

  • columns : 삭제할 열 이름 또는 열 이름 리스트 (여러 개일 경우)
  • index: 삭제할 index명 또는 index 리스트
  • inplace : 원본 변경 여부, True/False로 입력

DataFrame객체.drop_duplicates()

  • 중복 행 제거 후 첫 번째 행만 남김
  • subset='컬럼명', subset=['c1', 'c2', ...] Parameter를 활용해 중복 기준 컬럼 지정 가능
	import pandas as pd
    
    # DataFrame 생성
    col = ['col1', 'col2', 'col3']
    values = [
    			['A', 'a', '1'],
                ['B', 'b', '1'],
                ['A', 'b', '2'],
                ['B', 'b', '1'],
                ['A', 'a', '2'],
                ['A', 'b', '2'],
    ]
    a = pd.DataFrame(data=values, columns=col)
    a
    
	# 출력 결과	
        col1	col2	col3
    0	A		a		1
    1	B		b		1
    2	A		b		2
    3	B		b		1
    4	A		a		2
    5	A		b		2
  • subset 미지정
    • a라는 DataFrame객체의 중복값을 제거
    • 기준 값 없으므로 모든 컬럼의 값이 중복인 행 중 첫 번째 행을 남겨두고 나머지 제거
	# 중복행 제거
    a.drop_duplicates()
    
    # 출력 결과
    	col1	col2	col3
    0	A		a		1
    1	B		b		1
    2	A		b		2
    4	A		a		2
  • subset 지정
    • a라는 DataFrame객체의 col3의 값들을 기준으로 중복행 제거
    • col3의 값이 중복인 행 중 첫 번째 행을 남겨두고 나머지 제거
    # 중복행 제거
    a.drop_duplicates(subset = "col3")
    
    # 출력 결과 
        col1	col2	col3
    0	A		a		1
    2	A		b		2

컬럼/행 추가

컬럼 추가
DataFrame객체['추가할 컬럼명'] = [컬럼에 넣을 값 (list로)]

  • 마지막 열로 추가됨
  • 값 위치에 하나의 값만 입력하는 경우 모든 행에 해당 값이 대입됨
  • 각각 다른 값을 주려면 list에 담아 대입

열 삽입
DataFrame객체.insert(삽입할 위치의 index, '삽입할 컬럼명', 값)

파생변수 생성
`DataFrame객체['추가할 컬럼명'] = 연산

  • 파생변수 : 기존 열들의 값을 이용해 만든 열
  • 백터화 연산을 이용해 값 대입
	# DataFrame 생성
    col = ['수학1', '수학2', '미적분']
	values = [
            [95, 94, 88],
            [88, 92, 85],
            [95, 90, 92],
    ]
    a = pd.DataFrame(data=values, columns=col)
    a
    
    # 출력 결과
    	수학1	수학2	미적분
    0	95		94		88
    1	88		92		85
    2	95		90		92
    
    # 파생변수 생성
    a['수학 과목 평균'] = (a['수학1'] + a['수학2'] + a['미적분'])//3
    a
    
    # 출력 결과
        수학1	수학2	미적분	수학 과목 평균
    0	95		94		88		92
    1	88		92		85		88
    2	95		90		92		92

컬럼/행 값 조회

행 조회

  • 행 이름으로 조회: loc-indexer, 행 순번으로 조회: iloc-indexer 사용
  • indexing, slicing 모두 가능

행 이름으로 조회

  • DataFrame객체.loc[index 이름]
    • 한 행 조회
    • 조회할 행 index 이름 전달
    • 행 이름이 문자열인 경우 "" 표기법, 정수일 경우 정수 표기법 전달
  • DataFrame객체.loc[index 이름 리스트]
    • 여러 행 조회 시 사용
    • 조회할 행 index 이름 리스트로 전달(Fancy indexing)
  • DataFrame객체.loc[start index 이름 : end index 이름 : step(간격)]
    • slicing, end index 이름의 행까지 포함
  • DataFrame객체.loc[index 이름, 컬럼 이름]
    • 행과 컬럼 동시 조회, 둘 다 이름으로 지정

행 순번으로 조회

  • DataFrame객체.iloc[행번호]
    • 한 행 조회 시, 조회할 행 번호 전달
  • DataFrame객체.iloc[ 행번호 리스트 ]
    • 여러 행 조회, 조회할 행 번호 리스트 전달
  • DataFrame객체.iloc[start 행번호: stop 행번호: step]
    • 슬라이싱 지원, stop 행번호 포함 X
  • DataFrame객체.iloc[행번호 , 열번호]
    • 행과 컬럼 동시 조회, 둘 다 순번으로 지정

컬럼 조회

  • DataFrame객체['컬럼명'] 컬럼명 아래의 값들을 조회
  • DataFrame객체.컬럼명 컬럼명이 Python 식별자 규칙에 맞는 경우 .표기법 사용 가능
  • Fancy indexing : 여러 컬럼을 동시 조회할 경우 컬럼명을 리스트로 묶어 전달
  • 주의사항 : 컬럼은 순번 조회 불가, 컬럼 조회 indexer에서 슬라이싱을 하는 경우 행 조회 slicing이 됨

Boolean indexing 이용 조회

DataFrame객체[조건], DataFrame객체.loc[조건]

  • 원하는 조건을 만족하는 행 조회
  • 논리연산자 &(and), |(or), ~(not) 사용 가능, 단 사용 시 연산자들을 ()로 묶어줘야 함

0개의 댓글