본문 바로가기
AI & 데이터분석

[Python] python 라이브러리 - pandas 총 정리

by 잼들리 2022. 11. 26.

python에서 빠질 수 없는 라이브러리죠!

데이터 분석에 필수적인 라이브러리 pandas🐼에 대해서 알아봅시다 :)

🐼👩🏻‍💻


▶ pandas 불러오기

# pandas를 pd라는 별칭으로 불러옵니다.
# pd로 불러오는 것은 "국룰" 입니다.
import pandas as pd

✔️ DataFrame & Series 란 무엇일까요?

pandas를 배우기에 앞서 DataFrame과 Series에 대해서 알고갑시다.

데이터를 가장 효율적으로 처리, 조회, 분석하는 방법이 데이터프레임을 사용하는 것입니다.

보통 csv 파일, excel 파일 형태로 DB에서 읽어옵니다.

  • 데이터프레임 (DataFrame)
    • 데이터분석에서 가장 중요한 데이터 구조 (2차원 구조)
    • 변수들(각 열)의 집합

 

  • 시리즈 (Series)
    • 하나의 정보에 대한 데이터들의 집합 (1차원)


 

▶ 데이터프레임 만들기

# 딕셔너리 만들기
dict = {'Name': ['Gildong', 'Sarang', 'Jiemae', 'Yeoin'], # 고객 이름
        'Level': ['Gold', 'Bronze', 'Silver', 'Gold'], # 고객 등금
        'Score': [56000, 23000, 44000, 52000]} # 고객 점수

# 데이터프레임 만들기
df = pd.DataFrame(dict) # 대소문자 구분 잘 하기

# 확인
# head() default = 5
print(df.head())
# key -> column title
# value -> tuple


▶ CSV 파일에서 데이터 읽어오기

path = 'https://raw.githubusercontent.com/DA4BAM/dataset/master/titanic_simple.csv'
df = pd.read_csv(path)
df.head()


🔶 데이터프레임 정보 확인

데이터 탐색

  • head() 메소드 : 앞쪽 데이터 확인
df.head() # default head(5)
df.head(3)

 

  • tail() 메소드 : 뒤쪽 데이터 확인
df.tail() # default tail(5)
df.tail(3)

 

  • shape 속성 : 데이터프레임 모양 확인 → (행수, 열수) 형태
# 행 수와 열 수 확인
df.shape

 

  • columns 속성 : 열 이름 확인
# python dtype object == String(문자열)
df.columns

print(data.columns.values) # np array 형태

 

  • index 속성 : 인덱스 정보 확인
df.index

 

  • values 속성 : 값 확인
df.values

 

  • dtypes 속성 : 열 확인
# 열 자료형 확인
# objct == string
df.dtypes

 

  • list(): 열 이름이 리스트로 반환됨
# 데이터프레임을 리스트 함수에
# 넣으면 열 이름이 리스트로 반환됨.
list(data)

 

  • describe(): 기초 통계 정보 확인
# (count, mean, std, min .....)
df.describe()

 

  • info(): 인덱스, 열 값 개수, 데이터 형식
# 열 자료형, 값 개수 확인
df.info()

데이터 정렬 (sort_index)

  • 단일 열 정렬
# 단일 열 정렬
data.sort_values(by='MonthlyIncome', ascending=False)
# 월급 순으로 정렬, ascending = False -> 내림차순
  • 복합 열 정렬
# 복합 열 정렬
data.sort_values(by=['JobSatisfaction', 'MonthlyIncome'], ascending=[True, False])
# 열 2개 기준
# 직무만족도 + 월급 순
# 동률일 경우 -> 직무만족도(오름차순), 월금(내림차순)
  • 복합 열 정렬 + 인덱스 리셋
# 복합 열 정렬 + 인덱스 리셋
temp = data.sort_values(by=['JobSatisfaction', 'MonthlyIncome'], ascending=[True, False])
temp.reset_index(drop = True)
# drop = False: 기존 인덱스를 칼럼으로
# drop = True: 기존 인덱스 빼기

기본 집계

  • 고유값 확인 unique()
# MaritalStatus(결혼상태) 열 고유값 확인
# 기혼, 미혼, 이혼
print(data['MaritalStatus'].unique())
  • 고유값과 개수 확인 value_counts()
# MaritalStatus 열 고유값 개수 확인
print(data['MaritalStatus'].value_counts())

기본 통계 매소드 사용

  • sum()
# MonthlyIncome 열 합계 조회
# 모든 직원의 월급의 합
print(data['MonthlyIncome'].sum())
  • 최댓값 max()
# MonthlyIncome 열 최댓값 조회
# 월급의 최대값
print(data['MonthlyIncome'].max())
  • 평균값 mean()
# 'Age', 'MonthlyIncome' 열 평균값 확인
print(data[['Age', 'MonthlyIncome']].mean())
  • 중앙값 median()
# 'Age', 'MonthlyIncome' 열 중앙값 확인
print(data[['Age', 'MonthlyIncome']].median())

🔶 데이터프레임 조회

▶ 특정 열 조회 : df[열 이름] 

  • 시리즈로 조회
# Attrition(이직 여부) 열 조회 : 시리즈로 조회
temp1 = data['Attrition']
print(type(temp1)) # series
print(temp1)

# Attrition 열 조회2 : 시리즈로 조회
data.Attrition
  • 데이터프레임으로 조회
# Attrition, Age 열 조회 : 데이터프레임으로 조회
# 대괄호 안에 또 대괄호로 읽지 마시고, 대괄호 안에 리스트!!!
temp2 = data[['Attrition', 'Age' ]] # -> list
print(type(temp2)) # dataframe
temp2

조건으로 조회 : df.loc[행 조건, 열 이름]

  • 단일 조건 조회
# DistanceFromHome 열 값이 10 보다 큰 행 조회
data.loc[data['DistanceFromHome'] > 10]
  • 여러 조건 조회
    • [] 안에 여러 조건을 연결 할 때, (조건1) & (조건2) 형태로 괄호로 묶어야 함.
# and로 여러 조건 연결
# 교집합
data.loc[(data['DistanceFromHome'] > 10) & (data['JobSatisfaction'] == 4)]
  • isin([값1, 값2, …, 값n])
# 값 나열
data.loc[data['JobSatisfaction'].isin([1,4])]

# or 조건
# data.loc[(data['JobSatisfaction'] == 1) | (data['JobSatisfaction'] == 4)] 와 같음
  • between(값1, 값2, inclusive = “[ ]”)
    • inclusive → left, right, both, neither
# 범위 지정
data.loc[data['Age'].between(25, 30)] # -> between 안에 리스트가 아닌 시작값, 끝값 형태로 넣음

# and 조건
# data.loc[(data['Age'] > 25) & (data['Age'] < 30)] 와 같음
# 20보다 크거나 같고, 30보다 작거나 같은 범위
data.loc[data['Age'].between(20, 30, inclusive="both")]
  • 조건을 만족하는 행의 일부 열 조회
# 조건에 맞는 하나의 열 조회
# 월급이 10000$ 이상인 직원의 나이를 조회하라.
data.loc[data['MonthlyIncome'] >= 10000, ['Age']] # -> 리스트로 주면 dataframe
# 조건에 맞는 하나의 열 조회
# 월급이 10000$ 이상인 직원의 나이를 조회하라.
data.loc[data['MonthlyIncome'] >= 10000, 'Age'] # -> 변수로 주면 series

🔶 데이터프레임 집계

▶ 집계 관련 메소드

  • 합: sum()
  • 평균: mean()
  • 최댓값: max()
  • 최솟값: min()
  • 개수: count()

열 하나 집계

# MonthlyIncome 합계
data['MonthlyIncome'].sum()
# MonthlyIncome(월급), TotalWorkingYears(경력 년수) 각각의 평균
data[['MonthlyIncome', 'TotalWorkingYears']].mean()

groupby() 로 집계하기

  • as_index = True → group_by 변수 값이 인덱스로 설정됨
# MaritalStatus 별 Age 평균 --> 시리즈
data.groupby('MaritalStatus', as_index=True)['Age'].mean() # -> Series
# as_index = False -> 무조건 데이터프레임 형태로 조회됨
# MaritalStatus 별 Age 평균 --> 데이터프레임
# as_index = True : MaritalStatus를 인덱스로 설정
data.groupby('MaritalStatus', as_index=True)[['Age']].mean() # -> DataFrame

 

  • as_index = False → 인덱스 값 따로 설정됨
# MaritalStatus 별 Age 평균 --> 데이터프레임
# as_index = False : 행 따로 번호 생성 -> 대체로 False로 많이 씀
data.groupby('MaritalStatus', as_index=False)[['Age']].mean()

▶ 여러 열 집계

# 결혼 상태에 따른 나이와 월급의 평균
# 나이의 차이는 별로 없지만, 월급의 차이는 많이 남
data_mean = data.groupby('MaritalStatus', as_index=False)[['Age','MonthlyIncome']].mean()

# 확인
data_mean
# 'MaritalStatus', 'Gender'별 나머지 열들 평균 조회
# 이혼->여성, 남성 / 기혼->여성, 남성 / 미혼->여성, 남성
data_sum = data.groupby(['MaritalStatus', 'Gender'], as_index=False)[['Age','MonthlyIncome']].mean()

# 확인
data_sum

agg() 메소드로 다양한 집계 : df.groupby().agg([’함수’, ‘함수2’, …])

# 결혼 상태 별 월급의 최솟값, 최댓값, 평균값
# agg([함수의 리스트])
data_agg = data.groupby('MaritalStatus', as_index=False)[['MonthlyIncome']].agg(['min','max','mean'])
# 확인
data_agg
# 여러 열에 대한 각 열마다 다른 집계를 한번에 수행 가능
data_agg2 = data.groupby('Age', as_index=False)[['MonthlyIncome', 'MaritalStatus']].agg({'MonthlyIncome':'mean', 'MaritalStatus': 'count'})
data_agg2

🔶 데이터프레임 변경

열 이름 변경 : df.rename(columns = {dictionary}, inplace=True)

# rename() 함수로 열 이름 변경
# dictionary(key : value) 형태로 바꿈

# inplace = True -> 진짜 바꾸는 거야!!
# inplace = False -> 조회하는 것만 바꿔줌
# 바꿀 칼럼만 써주면 됨
data.rename(columns={'DistanceFromHome' : 'Distance', 
                    'EmployeeNumber' : 'EmpNo',
                    'JobSatisfaction' : 'JobSat',
                    'MonthlyIncome' : 'M_Income',
                    'PercentSalaryHike' : 'PctSalHike',
                    'TotalWorkingYears' : 'TotWY'}, inplace=True)

# 확인
data.head()

모든 열 이름 변경 : df.colums = [’co1’, ‘col2’, …, ‘coln’]

# 모든 열 이름 변경
# 원하는 것만 바꿀 수 없고, 모든 칼럼을 넣어줘야함
data.columns = ['Attr','Age','Dist','EmpNo','Gen','JobSat','Marital','M_Income', 'OT', 'PctSalHike', 'TotWY']

# 확인
data.head()

열 추가 : df[’newcol’] = ~~~

# Income_LY(올해 월급 - 작년 월급) 열 추가
data['Income_LY'] = data['M_Income'] / (1+data['PctSalHike']/100 )
data['Income_LY'] = round(data['Income_LY']) # 반올림

# 확인
data.head()

열 삭제 : df.drop(’col’, axis=1, inplace=True)

# 열 하나 삭제
data.drop('Income_LY', axis=1, inplace=True)
# numpy -> axis = 0 (열) / axis = 1 (행)
# panda -> axis = 0 (행) / axis = 1 (열)

# 확인
data.head()
  • 여러 열 삭제
# 열 두 개 삭제
data.drop(['JobSat2','Diff_Income'], axis=1, inplace=True)

# 확인
data.head()

map() 메소드 : dp[’col’] = df[’col’].map({’key1’ : value1, ‘key2’ : value2, ….. })

# Male -> 1, Female -> 0
data['Gen'] = data['Gen'].map({'Male': 1, 'Female': 0})

# 확인
data.head()

cut() 메소드 : pd.cut(df[’col’], bins, labels)

# 범위를 3등분해서 등급 구하기
# 월급 열을 3등분해서 a, b, c 등급으로 구하여라.
data['M_Income_Group'] = pd.cut(data['M_Income'], 3, labels=['a', 'b', 'c'] )

# 확인
data[['M_Income', 'M_Income_Group']].head()
# 월급 낮은 그룹 = a
# 월급 중간 그룹 = b
# 월급 높은 그룹 = c
# 등급 구하기
bin = [0, 10000, 15000, np.inf] # np.inf : 무한대
# (0~10000) / (10000~15000) / (15000~)
data['M_Income_Group2'] = pd.cut(data['M_Income'], bins=bin, labels=['a', 'b', 'c'])

# 범위 확인
data.groupby('M_Income_Group2', as_index = False)['M_Income'].agg(['min', 'max'])

 

 

 

댓글