[Python] 연습

[AIFB] Pandas DataFrame

Simon Yoon 2022. 8. 14. 22:48

DataFrame?

2차원(column과 row) 테이블 데이터 구조를 가진 자료형

 

DataFrame 생성 방법

① 딕셔너리를 활용하여 생성

② 리스트를 활용하여 생성

③ 파일을 읽어서 생성


① 딕셔너리를 활용하여 생성

a1 = pd.DataFrame({'a': [1, 2, 3], 'b': [4, 5, 6], 'c': [7, 8, 9]})

 

② 리스트를 활용하여 생성

a2 = pd.DataFrame([[1,2,3], [4,5,6], [7,8,9]], ["a","b","c"])
a2

왜 위와 같은 형태로 생성되는지를 확인하기 위해서는  shift + tab  을 활용하여 각 파라미터가 어떤 것을 의미하는지 알아볼 수 있다.

참고로 함수에 커서를 가져다 두고  shift + tab  을 누르면 해당 함수의 parameter를 볼 수 있음

 

③ 파일을 읽어서 DataFrame 생성

문법:  DataFrame명 = pd.read_csv(파라미터) 

 

• read_csv 함수의 파라미터

    - filepath or buffer: 파일경로/파일이름.csv를 입력하여 파일을 불러옴

    - sep or delimiter: 구분자값

    - encoding: 인코딩

    - usecols: 실제로 dataframe에 로딩할 columns만 설정


DataFrame의 head, tail

특정 변수에 제대로 데이터가 들어갔는지 확인하기 위해 사용

문법:  DataFrame.head(n = 10) (default값은 5) 

 

DataFrame 기본함수

함수 설명 예시
shape row와 column의 개수를 튜플로 반환함 cust.shape
columns 컬럼명을 확인 cust.columns
info 데이터 타입, 각 아이템의 개수 등을 출력함 cust.info()
describe 데이터 요약 통계량을 나타냄 cust.describe()
dtype 데이터 형태의 종류(Data Type) cust.dtypes

 

Data 조회

1) column 선택하기

기본적으로 []는 column을 추출

컬럼 인덱스일 경우 인덱스의 리스트 사용 가능

>> 리스트를 전달할 경우 결과는 DataFrame

>> 하나의 컬럼명을 전달할 경우 결과는 Series

 

>> 하나의 컬럼 선택하기: Series 형태로 가지고 올 수도, DataFrame 형태로 가지고 올 수 있음

cust.cust_class
cust['cust_class']
cust[['cust_class']]

>> 복수의 컬럼 선택하기

cust[['cust_class', 'age', 'bill_amt']]

 

2) DataFrame slicing

> 특정 행 범위를 가지고 오고 싶다면 [] 사용

> DataFrame의 경우 기본적으로 [] 연산자가 column 선택에 사용되지만 slicing은 row 레벨로 지원

# 7,8,9행을 가지고 옴 (인덱스 기준)
cust[7:10]

 

데이터를 가져오는 두가지 방법

loc: DataFrame에 존재하는 인덱스를 그대로 사용 (인덱스 기준으로 행 데이터 읽기)

iloc: DataFrame에 존재하는 인덱스 상관없이 0 based index로 사용 (행 번호 기준으로 행 데이터 읽기)

#loc
cust.loc[[289]]
cust.loc[[102, 202, 302]]
#iloc
cust.iloc[[2, 102, 202]]

> row, column 동시에 선택하기

# 100, 200, 300 대상으로 cust_class, sex_type, age, bill_amt, arpu_amt  col 가지고 오기(loc사용)
cust.loc[[100, 200, 300], ['cust_class', 'sex_type', 'age', 'bill_amt', 'arpu_amt']]   # row, col
# 같은 형태로 iloc사용하기 (index를 level로 가지고 오기)
# 100, 200, 300 대상으로 cust_class, sex_type, age, bill_amt, arpu_amt  col 가지고 오기(iloc사용)
cust.iloc[[0, 100, 200], [3, 4, 5, 9, 10]]

 

컬럼 조건문으로 행 추출하기

> 해당 조건에 맞는 row만 선택

> 조건을 명시한 형태로 indexing 하여 가지고 옴

 

eg. 남자이면서 3개월 평균 청구 금액이 50000 이상이면서 100000 미만인 사람만 가지고 오기

#조건을 전부다  [ ]안에 넣어 주면 됨
extract = cust[(cust['sex_type']=='M') & (cust['avg_bill_amt']>=50000) & (cust['avg_bill_amt']< 100000)]
extract.head()
# 조건문이 너무 길어지거나 복잡해지면...아래와 같은 방식으로 해도 무방함
# 남자이면서 
sex = cust['sex_type']=='M'
# 3개월 평균 청구 금액이 50000 이상이면서 100000 미만
bill = (cust['avg_bill_amt']>=50000) & (cust['avg_bill_amt']< 100000)

cust[sex & bill].head()

 

1) 새 column 추가하기 예시

# r3m_avg_bill_amt 두배로 새로운 col만들기
cust['r3m_avg_bill_amt2'] = cust['r3m_avg_bill_amt'] * 2
cust.head()

# 기존에 col을 연산하여 새로운 데이터 생성
cust['r3m_avg_bill_amt3'] = cust['r3m_avg_bill_amt2'] + cust['r3m_avg_bill_amt']
cust.head()

> insert() 함수 사용

# 새로은 col들은 항상맨뒤에 존재 원하는 위치에 col을 추가하고자 하는 경우
# 위치를 조절 하고 싶다면(insert함수 사용)
cust.insert(10, 'r3m_avg_bill_amt10', cust['r3m_avg_bill_amt'] *10)  # 0부터 시작하여 10번째 col에 insert
cust.head()

 

2) column 삭제하기

axis라는 parameter는 삭제를 가로(행) 기준으로 할 것인지, 세로(열) 기준으로 할 것인지 명시하는 drop() 함수의 parameter임

# axis : dataframe은 차원이 존재 함으로 항상 0과 1이 존재 
# (0은 행레벨, 1을 열 레벨)
cust.drop('r3m_avg_bill_amt10', axis=1)

단, 위와 같이 작성하면 원본 데이터는 안 지워진 상태이다. 단순히 결과값을 사전에 보는 정도라고 이해하면 된다.

따라서 저장하기 위해서는 아래의 두가지 방법을 사용할 수 있다.

# 원본 데이터를 지우고자 한다면... 
# 방법1 : 데이터를 지우고 다른 데이터 프레임에 저장
cust1 = cust.drop('r3m_avg_bill_amt10', axis=1)
cust1.head()
# 원본 자체를 지우고자 한다면...
# 방법 2 : inplace 파라미터를 할용 True인 경우 원본데이터에 수행
cust.drop('r3m_avg_bill_amt10', axis=1, inplace=True)