데이터 분석/강의 노트

Pandas: Series와 DataFrame, 데이터 불러오기, 조건에 맞는 데이터 추출하기

hyunseo 2024. 7. 4. 15:55

Pandas란?

Pandas는 빠르고 강력하며 유연하고 사용하기 쉬운 오픈 소스 데이터 분석 및 조작 도구로, 파이썬 프로그래밍 언어를 기반으로 구축되었습니다.

 

Pandas는 데이터를 쉽고 빠르게 정렬하거나 인덱싱할 수 있고, 그루핑, 피봇팅과 같은 고급 기능을 제공합니다. 또한, join을 통해 데이터를 병합하고, 요약하거나 통계를 구하기도 쉽습니다.

 

import pandas as pd

 

pandas의 별칭은 통상적으로 pd로 칭합니다.

 

Series와 DataFrame 이해하기

Series

Series(이하 시리즈)는 pandas에서 사용하는 일종의 리스트입니다. 파이썬의 딕셔너리와 리스트 타입의 데이터를 시리즈로 만들 수 있습니다.

 

dic = {'a': 'apple','b': 'cherry','c': 'banana'}
dic_series = pd.Series(dic)

print(type(dic_series), dic_series, sep='\n')
# <class 'pandas.core.series.Series'>
# a    apple
# b    cherry
# c    banana
# dtype: int64

 

ls = [1, 2, 3]
ls_series = pd.Series(ls)

print(type(ls_series), ls_series, sep='\n')
# ls = [1, 2, 3]
# ls_series = pd.Series(ls)
# print(type(ls_series), pd.Series(ls), sep='\n')

 

리스트의 경우, 시리즈를 선언할 때 index 값을 지정해줄 수 있습니다.

 

ls_series = pd.Series(ls, index=['a','b','c'])
print(ls_series)
# a    1
# b    2
# c    3
# dtype: int64

 

Series의 정보 확인하기

.values를 통해 시리즈의 요소를, .index를 통해 시리즈의 인덱스를 확인할 수 있습니다. .dtype을 통해서는 데이터의 자료형을 알 수 있습니다.

 

print(dic_series.values)    # [apple cherry banana]
print(dic_series.index)     # Index(['a', 'b', 'c'], dtype='object')
print(dic_series.dtypes)    # int64

print(ls_series.values)    # [1 2 3]
print(ls_series.index)     # Index(['a', 'b', 'c'], dtype='object')
print(ls_series.dtypes)    # int64

 

DataFrame

DataFrame(이하 데이터프레임)은 행과 열로 만들어지는 2차원 배열의 형태의 데이터입니다. 데이터프레임의 열은 각각의 시리즈 객체입니다.

 

dic = {'Fruits': ['Apple','Cherry','Banana']
       , 'Count': [10, 12, 7]
       , 'Price': [1000, 1700, 900]}

df = pd.DataFrame(dic)
df

 

  Fruits Count Price
0 Apple 10 1000
1 Cherry 12 1700
2 Banana 7 900

 

보시는 바와 같이, 딕셔너리의 key 값은 열의 이름이 되고, value의 리스트의 각 요소는 행에 각각 들어가는 것을 알 수 있습니다. 이때, value의 리스트의 개수가 모두 같아야 합니다. 하나라도 길이가 다른 리스트가 있으면 에러가 발생합니다.

 

ls = [['Apple', 10, 1000]
      , ['Cherry', 12, 1700]
      , ['Banana', 7, 900]]
df = pd.DataFrame(ls, columns=['Fruits', 'Count', 'Price'])
df

 

딕셔너리로 데이터프레임을 만들 때는 열 데이터 별로 리스트를 만들었다면, 리스트로 데이터프레임을 만들 때는 행의 데이터를 리스트로 만듭니다. 그리고 마지막에 데이터 프레임을 선언할 때 열의 이름을 지정해줍니다.

 

데이터 불러오기, 저장하기

Pandas의 큰 장점 중 하나는 외부 데이터를 다루기 용이하다는 것입니다. 데이터를 읽을 때는 read_xxx()로 불러올 수 있고, 저장할 때는 to_xxx()로 저장할 수 있습니다.

 

File Format Reader Writer
CSV read_csv() to_csv()
Excel read_exel() to_excel()
JSON read_json() to_json()
SQL read_sql() to_sql()
HTML read_html() to_html()

 

csv_file_path = './data/titanic_train.csv'
csv_data = pd.read_csv(csv_file_path)

 

csv_data.head()를 통해 데이터가 제대로 가져와 졌는지 확인합니다.

모든 데이터를 가져올 수도 있지만, 특정 열만 가져올 수도 있습니다. usecols 값에 가져오길 원하는 열의 이름을 리스트의 형태로 입력해주면 usecols에서 지정한 데이터만 가져옵니다. index_col을 사용하면 인덱스 열로 사용할 열을 지정할 수 있습니다.

 

csv_data1 = pd.read_csv(csv_file_path, index_col = 'PassengerId', usecols = ['PassengerId','Survived','Pclass','Age'])
csv_data1.head()

 

엑셀 파일의 경우 sheet_name을 통해 원하는 시트의 내용을 가져올 수 있고, html의 경우 encoding을 통해 인코딩 혁식을 지원할 수 있는 등, 가져오는 데이터의 형태에 따라 여러 가지 데이터 옵션을 사용할 수 있습니다.

 

조건에 맞는 데이터 추출

행 조회하기

파이썬의 리스트 슬라이싱처럼, 대괄호[]와 콜론:을 통해 특정 열과 행을 조회할 수 있습니다.

 

df = pd.read_csv(...)

df[:10] # 0번 인덱스부터 9번 인덱스까지 가져옵니다.
df[2:8] # 2번 인덱스부터 7번 인덱스까지 가져옵니다.

 

열 조회하기

열을 조회할 때는 파이썬의 딕셔너리를 조회할 때와 같은 방법을 사용할 수 있습니다.

 

df['Age']  # Age 열의 모든 데이터를 가져옵니다.
df.Age     # 위와 같습니다.

 

결과값을 데이터프레임의 형태를 보고 싶다면 to_frame() 함수를 사용하거나 대괄호로 두 번 감싸주면 됩니다.

 

df['Age'].to_frame()
df[['Name', 'Age']]

 

원하는 열과 행 동시에 가져오기

loc()이나 iloc() 함수를 사용하면 원하는 행과 열을 동시에 가져올 수 있습니다. loc()은 레이블의 값을 가지고 데이터를 조회합니다. iloc()은 인덱스 값을 가지고 데이터를 조회합니다.

 

loc(행 조건, 열 조건)의 형태로 사용합니다.

 

df.loc[3,]        # 3번 행의 모든 데이터를 가져옵니다.
df.loc[:,'Name']  # Name 열의 모든 데이터를 가져옵니다.
df.loc[3,'Name']  # Name 열의 3 행 데이터를 가져옵니다.
df.loc[3:5,['Age','Class']]  # 3번 행과 4번 행의 Age 값과 Class 값을 가져옵니다.

 

위의 코드의 두 번째 줄을 보면 행 조건에 콜론:만 있는 것을 볼 수 있습니다. 이것은 리스트의 슬라이싱을 사용하면 됩니다. list[:]은 리스트의 처음부터 끝까지 가져오는 코드입니다. 따라서 행 조건이 :인 것은 처음부터 끝까지 가져오라는 뜻입니다.

반대로, iloc()은 각 행과 열의 index 값을 가지고 데이터를 가져옵니다.

 

df.iloc[3:7,2:4]    # 3번부터 6번 행까지의 데이터 중 2번, 3번 열만 가져옵니다.
df.iloc[[1,3,5],]   # 1번, 3번, 5번 행을 가져옵니다.

 

데이터 정렬하기

sort_values(컬럼명, ascending) 함수를 사용하면 데이터를 정렬할 수 있습니다. ascending은 오름차순 여부입니다. 기본값은 True이고, 내림차순 정렬을 하고 싶을 때는 False를 입력합니다.

 

df.sort_valeus('Age', ascending=False)

 

정렬하고 싶은 열이 여러 개라면 리스트의 형태로 입력합니다.

 

df.sort_values(['Age', 'Fare'])

 

특정 조건을 충족하는 데이터 추출하기

조건식을 통해 데이터를 필터링할 수 있습니다. 데이터프레임[조건식].query('조건식')의 두 가지 형태로 사용할 수 있습니다.

 

첫 번째 형태로 사용할 경우, &(and)나 |(or)를 사용해서 복잡한 조건을 설정할 수 있습니다. 두 번째 방법의 경우 반드시 조건식의 내용을 문자열로 작성해야 합니다.

 

df[df['Pclass'] == 1]
df[(df['Pclass'] == 1) & (df['Age'] >= 30)]

df.query('Pclass == 1')
df.query('Pclass == 1 and Age >= 30')

 

.isin() 함수나 in 키워드를 사용하면 데이터를 사용하면 연속적이지 않은 여러 개의 데이터를 조회할 수 있습니다.

 

df[df['PassengerId'].isin([123, 456, 789])]

df.query('PassengerId in [123, 456, 789]')
df.query('PassengerId.isin([123, 456, 789])')

 


 

 

 

Pandas를 이용한 데이터 가공: 행과 열 가공하기, 결측값 처리하기

이번에는 Pandas로 데이터를 가공하는 방법에 대해 알아보겠습니다. import pandas as pdfile_path = './data/titanic_train.csv'df = pd.read_csv(file_path) 인덱스, 행, 열인덱스인덱스는 데이터프레임에서 각 행의 이

dararium.tistory.com