KDT 수업/Python

[데이터분석] Pandas 판다스-1

니니는 진짜 전설이다 2023. 6. 9. 17:34

목차

  1. 판다스(Pandas )
    • 1-1. Series와 Dataframe
  2. CSV파일 다루기
  3. 엑셀파일 읽어오기
  4. 데이터프레임 기본정보 알아보기
    • 4-1. 열(column)다루기
    • 4-2. 통계정보 알아보기
    • 4-3. 형태(shape)알아보기
    • 4-4. 원하는 개수의 데이터 보기
    • 4-5. 정렬하기
  5. 데이터 다루기
    • 5-1. 범위 선택
  6. Boolean Indexing
  7. isin

 


1. 판다스(Pandas)

  • 판다스는 파이썬에서 데이터 조작과 분석을 위해 '웨스 맥키니'가 개발한 라이브러리이다
  • 데이터 구조(data frame)와 데이터 조작 기능을 제공하여 데이터 처리 작업을 효율적으로 수행할 수 있게 도와준다
  • 판다스의 핵심 데이터 구조는 '시리즈(Series)'와 '데이터프레임(DataFrame)'이다
  • 판다스는 데이터 처리 작업을 효율적으로 수행하기 위해 NumPy와 함께 사용되는 경우가 많다. (NumPy는 다차원 배열을 다루는 기능을 제공하는 라이브러리다)

# 판다스 설치하기 / import 하기 

!pip install pandas

import pandas as pd

(나는 구글코랩에서 하기때문에 설치는 따로 할 필요 없고 그냥  import만 하면 되긴 함)

 

 

 


1-1. Series와 Dataframe

  • 시리즈(Series)
    • 판다스에서 제공하는 데이터 구조 중 하나로, 일련의 값(value)인덱스(index)로 구성된 1차원 배열이다 => 1차원 표
    • 시리즈는 각 값에 대해 고유한 인덱스를 가지며, 이 인덱스를 사용해 각 값에 접근할 수 있다
    • 시리즈의 인덱스는 기본적으로 정수로 지정되지만, 필요에 따라 사용자가 임의의 값이나 레이블을 인덱스로 지정할 수 도 있다
    • 시리즈를 생성하기 위해서는 판다스의 Series 클래스를 사용한다 

 

  • 데이터프레임(DataFrame)
    • 판다스에서 제공하는 데이터구조 중 가장 중요하고 자주 사용되는 구조다
    • 데이터프레임은 값(value)과 인덱스(index) 그리고 열(columns)로 구성된 2차원 테이블로, 행은 개별 데이터 레코드를 나타내고 열은 각 데이터의 특성을 나타낸다 
    • 데이터프레임은 엑셀 스프레드시트나  SQL테이블과 유사한 형태로 데이터를 조작하고 분석할 수 있다

데이터프레임과 시리즈의 값은 넘파이의 ndarray기반이다

 

 

# 2차원 배열 데이터 만들기

data1 = [[67, 93, 91],
         [75, 69, 96],
         [75, 81, 82],
         [62, 70, 75],
         [98, 45, 87]]

 

# 인덱스 만들기

idx1= ['김사과', '반하나', '오렌지', '이메론', '배에리']

 

# 컬럼 만들기

col1= ['국어', '영어', '수학']

 

# 판다스의 데이터프레임에 위에 만든 데이터 넣어보기

pd.DataFrame(data1)

>>  DataFrame에는 데이터, 인덱스, 컬럼이 들어간다.

지금은 아까 만들어둔 데이터만 들어갔기 때문에 인덱스와 컬럼 자리가 비어있어서 그냥 정수가 들어가있는 것을 볼 수있다.

 

 

 

 

# 이번에는 데이터, 인덱스, 컬럼 모두 넣어보기

pd.DataFrame(data1, idx1, col1)

>> 만들어둔 리스트들이 각각 인덱스와 컬럼자리에 들어간 것을 볼 수 있다!

순서를 지켜서 넣어주어야 한다! 중요*

 

 

 

 

# 넣을 값이 두개밖에 없는 경우에는 값이 들어갈 자리를 써준다

pd.DataFrame(data=data1, columns=col1)

>> 각각 데이터와 컬럼이 자기 자리에 들어간 것을 볼 수 있다.

그리고 위 방식으로 쓸때는 순서를 지키지 않아도 된다.

 

 

 

 

 

 

# 변수에 담아주기

df1= pd.DataFrame(data1, idx1, col1)

# 데이터프레임에서 값 뽑기

df1.values

 >> 값만 뽑히는 것을 볼 수 있다

 

 

 

 

# 인덱스만 뽑기

df1.index

>> 타입이 object형이면 그냥 문자형이라고 생각하면 된다

# 컬럼만 뽑기 

df1.columns

 

 

 

 

 

# 1차원 배열 만들기 

data2= [67, 75, 75, 62, 98]

 

# 판다스의 시리즈에 데이터 넣어보기

pd.Series(data2)

>> 시리즈는 데이터와 인덱스로 이루어진 1차원 표! 

데이터만 넣었더니 인덱스가 자동으로 붙고 일렬로 나오는 것을 볼 수 있다

 

 

 

 

# 데이터와 인덱스 넣어보기 

pd.Series(data2, idx1)

 

 

 

 

 

 

#  시리즈에서 값 뽑아보기

se1.values

 

 

 

# 인덱스만 뽑아보기

se1.index

 

 

 

# 딕셔너리를 사용해서 데이터프레임 생성해보기 

딕셔너리 형태로 data를 만들어준다. 각 열의 이름을 키(key)로, 해당 열의 데이터를 값(value)로 가지고 있다 

dic1= {
    '국어':[67, 75, 75, 62, 98],
    '영어':[93, 69, 81, 70, 45],
    '수학':[91, 96, 82, 75, 87]
}

 

# 데이터프레임에 딕셔너리와 인덱스 넣어주기

df2= pd.DataFrame(data=dic1, index=idx1)
df2

>> 딕셔너리의 key: value가 각각 column과 value 자리에 들어간 것을 볼 수 있다

 

 

 

 

 

 

 

 


2. CSV 파일 다루기

  • CSV(Comma-Separated Values) 파일:  데이터를 쉼표(,)로 구분하여 저장하는 텍스트 파일 형식
  • CSV파일은 테이블형태의 데이터를 저장하기 위해 사용되고, 여러 프로그램과 시스템간에 데이터를 공유하고 이동하는 데 많이 활용된다
  •  엑셀로 로딩할 수 도 있지만 쉼표로 구분된 CSV가 더 가볍기 때문에 데이터로 많이 사용한다
  • CSV파일은 행과 열로 구성된 데이터를 저장하는데, 각 개별 데이터 레코드를 나타내고 각 데이터의 특성을 나타낸다
  • 판다스는 CSV파일을 읽고 쓰는 기능을 제공한다
    • read_csv( ) 함수를 사용해 CSV파일을 데이터프레임으로 읽을 수 있다
    • to_csv( ) 함수를 사용해 데이터프레임을 CSV파일로 저장할 수 있다

CSV 포멧의 파일을 제공하는 [공공데이터 포털](https://www.data.go.kr)

 

CSV파일을 읽고 쓰는 예시

import pandas as pd

# CSV 파일 읽기
df = pd.read_csv('data.csv')

# 데이터프레임 확인
print(df)

# CSV 파일 저장
df.to_csv('new_data.csv', index=False)

 

▼학습에 사용할 파일

korean-idol.csv
0.00MB

 

 

# 파일 인코딩 방법

pd.read_csv('korean-idol.csv')

# 경로를 써줘서 불러올수도 있다
pd.read_csv('/content/drive/MyDrive/데이터 분석/korean-idol.csv')

 

 

 


3. 엑셀파일 읽어오기

▼위와 똑같은 내용을 담고있는 엑셀파일!

korean-idol.xlsx
0.01MB

# 파일을 넣어둔 경로로 엑셀파일 불러오기

pd.read_excel('/content/drive/MyDrive/데이터 분석/korean-idol.xlsx')

 

 

 


4. 데이터프레임 기본정보 알아보기

df= pd.read_csv('http://bit.ly/ds-korean-idol')
type(df)

>>  type() 를 사용해 타입을 확인할 수 있다

 

# info( ): 기본적인 행, 열의 정보와 데이터 타입을 반환해준다

df.info()

 

 

 

 

 

 

 

 

 

 

 

 


4-1. 열(column)다루기

# 현재 파일의 column 값 확인하기

df.columns

 

# 새로운 column명을 담은 리스트 만들어주고, df.columns 에 새로 만든 컬럼명을 넣어주기 

new_column = ['name', 'group', 'company', 'gender', 'birthday', 'height', 'blood', 'brand']
df.columns = new_column

# 그 후에 컬럼을 확인해보면 바뀌어있는 것을 확인할 수 있다

df.columns

 

 


4-2. 통계정보 알아보기

# describe( ): 통계 정보를 출력한다. 수치 정보만 가져올 수 있다!

df.describe()

# 포함하고싶은 타입을 넣어서 출력할수도 있다

df.describe(include=object)

 

 


4-3. 형태(shape)알아보기

df.shape

>> 15행 8열임을 알 수 있다

 

 


4-4. 원하는 개수의 데이터 보기

  • head(): 상위 5개의 row를 출력
  • head(n): 상위 n개의 row를 출력
  • tail(): 하위 5개의 row를 출력
  • tail(n): 하위 n개의 row를 출력

# head( )

df.head()

0 부터 4까지 5개를 불러온 모습을 볼수있다!

 

# head(n)

df.head(7)

0 부터 6까지 7개를 불러온 모습을 볼수있다!

 

# df.tail( )

df.tail()

10 부터 14까지 5개를 불러온 모습을 볼수있다!

 

# df.tail(3)

df.tail(3)

12 부터 14까지 3개의 데이터를 불러온 모습을 볼 수 있다!

 

 


4-5. 정렬하기

# 인덱스로 오름차순 정렬하기 (기본값임)

df.sort_index()

 

# 인덱스로 내림차순 정렬하기

df.sort_index(ascending=False)

인덱스 내림차순 정렬된 모습을 볼 수 있다

 

 

# 값에 따른 오름차순 정렬

df.sort_values(by= 'height')

height를 기준으로 오름차순

키가 작은 키부터 큰키까지 정렬되어 있는 모습을 볼수있다!

 

# 값에 따른 내림차순 정렬

df.sort_values(by= 'height', ascending=False)

키가 큰 키부터 작은 키까지 정렬되어 있는 모습을 볼수있다!

 

 

# NaN을 가장 위로 올려두기: na_position의 기본값은 맨 아래

df.sort_values(by='height', na_position='first')

 

# 한가지 이상의 기준으로 정렬하기

df.sort_values(by= ['height', 'brand'], ascending=[False, True], na_position='first')

1차 정렬은 키 내림차순으로, 2차 정렬은 브랜드 오름차순으로 한다

그리고 파이썬에서는 두개 이상을 쓸때는 리스트로 적는다!

키 내림차순으로 정렬후 키가 같은 경우에는 브랜드 오름차순으로 정렬했음을 볼 수 있다

 

 

 

 


5. 데이터 다루기

# 데이터프레임에서 원하는 컬럼의 값만 가져오기

df['blood']

 

# 타입 찍어보기

type(df['blood'])

타입을 찍어보면 값과 인덱스만 있으므로 시리즈가 나오는 것을 볼수있다

 

type(df.blood)

이렇게 해도 같은 값이 나오는 것을 알 수 있다

 

 


5-1. 범위 선택

# 위에서 세개만 선택하는 방법

df.head(3)
df[:3]

head를 써도 슬라이싱을 써도 같은 결과가 나온다

 

# loc 인덱싱 

: loc인덱싱은 판다스에서 데이터프레임이나 시리즈의 특정 행이나 열에 접근하기 위해 사용되는 인덱싱 방법 중 하나다. loc 인덱서를 사용하면 라벨(label)을 기반으로 데이터를 선택할 수 있다.

데이터프레임에서 인덱싱을 사용하려면  loc[ ] 을 사용하고 인덱서 안에 행과 열의 라벨을 지정한다.

행 인덱스와 열 인덱스에 숫자 대신 문자열 또는 사용자 지정 라벨을 사용하는 경우, loc인덱싱은 특히 유용하다.

df.loc[:, 'name'] 
# 레이블(이름) 인덱싱, 행과 열 모두 인덱싱과 슬라이싱이 가능
# 위의 경우 모든 행의 name 값을 가져오게됨

df.loc[2:5, 'name']
# 라벨 기반 인덱싱인 loc인덱싱을 사용
# 데이터프레임 'df'에서 'name'열에 있는 인덱스 2부터 5까지에 해당하는 행의 값을 선택하는 코드!

df.loc[:, ['name', 'gender', 'height']]
# 'name', 'gender', 'height'열에서 모든 행을 가져오기

 

# loc인덱싱은 열(column)도 인덱싱 할 수 있다

df.loc[3:8, 'name':'gender']
# 'name'부터 'gender'열까지 3행부터터 8행까지 불러오기

 

# iloc : 데이터프레임에서 위치 기반 인덱싱을 사용하여 특정 행과 열을 선택하는 메서드. 정수 인덱스를 기반으로 행과 열을 선택할 수있다. 

df.iloc[:, [0, 2]]
# 첫번째 열[0]과 세번째 열[2]에 해당하는모든 행을 선택하여 반환한다

위에서는 인덱스 0과 인덱스 2를 선택한거지만 대괄호를 제거하면 0부터 2앞까지의(0부터 1까지) 열을 선택한다!

df.iloc[:,0:2]  
# 2번 컬럼을 포함하지 않음

 

# 행과 열에 전부 적용 가능하다

df.iloc[1:3, 2:4]
# 행 1부터 2까지, 열 2부터 3까지

 

 

 


6. Boolean Indexing

  •  불리언 인덱싱은 불리언 조건을 사용하여 데이터프레임에서 특정 조건을 만족하는 행을 선택하는 방법이다. 조건은 불리언 시리즈로 표현되며, 이 시리즈는 데이터프레임의 행 수와 동일한 길이를가져야 한다.
  • 일반적인 사용형식: df[조건식]   여기서 조건식은 데이터프레임의 각 행에 대해 참(True) 또는 거짓(False)값을 가지는 불리언 시리즈다.

 # 1. 조건에 해당하는지 여부를 나타내는 불리언 시리즈를 생성하는 코드

df['height']>=180

# 2. 조건에 해당하는 행들만 선택하는 코드

df[df['height']>=180]

 위의 두 코드의 차이는 반환하는 결과의 형태다.  1은 단순히 불리언 시리즈를 반환하는 반면, 2는 조건을 만족하는 행들로 이루어진 새로운 데이터프레임을 반환한다. 

 

# 조건 추가

df['name'][df['height']>=180]

>> height열에서 180 이상인 행들을 선택한 후, 해당 행들의 name열의 값을반환하는 코드.

df['height']>=180 로 불리언 시리즈를 생성한 후 , 해당 행들의  name열의 값을 반환한다.

 

 

df[['name', 'gender', 'height']][df['height']>=180]

 >> height열에서 180 이상인 행들을 선택한 후, 해당 행들의 name, gender, height열의 값을반환하는 코드. df['height']>=180 로 불리언 시리즈를 생성한 후 , 해당 행들의  name, gender, height열의 값을 반환한다.

 

 

 

df.loc[df['height']>=180 ,['name', 'gender', 'height']]

>> 위의 코드와 결과적으로 동일한 결과를 반환한다.

차이점은 사용하는 인덱싱 방식에 있다.  loc 인덱서를 사용하여 한번에 조건과 열을지정한다. 일반적으로는 loc인덱서를 사용해 조건과 열을 동시에 지정하는 방법이 더 효율적이다. 

 

 

 

 

 


7. isin

  • isin은 데이터프레임에서 열의값이 주어진리스트나 시리즈에 포함되는지 여부를 확인하는 메서드다  
  • 이 메서드를 사용하면 데이터프레임의 특정 열에서 여러 값을 동시에 비교할 수 있다
  • isin메서드의 일반적인 사용형식: df['열이름'].isin(값들)

 

# 먼저 데이터프레임을 찍어본다

df

 

# 변수에 회사명 담은 후 company열에서 플레디스 또는 SM 값을 포함하는지 여부를 확인 

company= ['플레디스','SM']
df['company'].isin(company)

>> 불리언 시리즈가 반환된다. 

 

 

 

 

 

 

 

 

 

 

df[df['company'].isin(company)]

>> 위에서 생성한 불리언 시리즈를 사용해 원본 데이터프레임 df 에서 조건을 만족하는 행들만 선택한 결과를 반환한다. 

 

 

 

 

df.loc[df['company'].isin(company)]

 >> loc 인덱서를 사용해 조건을 만족하는 행들을 선택한다. (= True인 행들만) 해당 행들에 대한 모든 열의 값을 반환한다.