판다스(Pandas) 기초 실습하기(데이터 프레임 생성, 행과 열 추가 및 삭제, ...)
판다스란?
판다스(Pandas)
: 파이썬에서 데이터를 다루고 분석하는 데 사용되는 강력한 라이브러리
- 주로 표 형식의 데이터를 다루는 데 특화되어 있으며, 데이터를 쉽게 읽고 저장하고 조작할 수 있다.
- 데이터 프레임(DataFrame)과 시리즈(Series)라는 두 가지 핵심 데이터 구조를 제공한다.
데이터 프레임(DataFrame)
: 표 형식의 데이터 구조로, 행과 열로 이루어져 있다.
- 각 열은 서로 다른 유형의 데이터를 포함할 수 있다.
- Excel 스프레드시트와 유사하며, 데이터베이스나 CSV 파일에서 데이터를 읽어와 처리하는 데 매우 유용하다.
시리즈(Series)
: 1차원 배열 형태의 데이터 구조로, 각 데이터와 연결된 인덱스를 가진다.
- 특정 열 또는 행의 데이터를 나타내며, 데이터프레임의 열이나 행을 선택하거나 생성할 때 사용된다.
특성 | 데이터프레임(DataFrame) | 시리즈(Series) |
차원 | 2차원 데이터 구조(행과 열) | 1차원 데이터 구조 |
내용 | 여러 열을 포함하고, 서로 다른 유형의 데이터를 가질 수 있음 | 단일 열을 포함하며, 동일한 유형의 데이터만 가짐 |
실습하기
1. pandas 모듈 임포트 하기
import pandas as pd
2. DataFrame 생성하기
① 리스트 -> DataFrame
data = [
['변우석', 34, 'ESFJ', '1991-10-31'],
['김혜윤', 29, 'ISTJ', '1996-11-10'],
['송건희', 28, 'ENFJ', '1997-08-16'],
['이승협', 33, 'ESTP', '1992-10-31']]
df = pd.DataFrame(data, columns=['Name', 'Age', 'MBTI', 'Birth'])
df
② 딕셔너리 -> DataFrame
data = {'Name' : ['변우석', '김혜윤', '송건희', '이승협'],
'Age' : [34, 29, 28, 33],
'MBTI' : ['ESFJ', 'ISTJ', 'ENFJ', 'ESTP'],
'Birth' : ['1991-10-31', '1996-11-10', '1997-08-16', '1992-10-31']}
df = pd.DataFrame(data)
df
Name | Age | MBTI | Birth | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 |
1 | 김혜윤 | 29 | ISTJ | 1996-11-10 |
2 | 송건희 | 28 | ENFJ | 1997-08-16 |
3 | 이승협 | 33 | ESTP | 1992-10-31 |
3. 파일 저장하고 불러오기
① 파일 저장하기
df.to_csv('data.csv', index = False)
- index = False를 하지 않고 저장하면 기본적으로 인덱스 열이 추가되어 저장된다.
Unnamed: 0 | Name | Age | MBTI | Birth | |
0 | 0 | 변우석 | 34 | ESFJ | 1991-10-31 |
1 | 1 | 김혜윤 | 29 | ISTJ | 1996-11-10 |
2 | 2 | 송건희 | 28 | ENFJ | 1997-08-16 |
3 | 3 | 이승협 | 33 | ESTP | 1992-10-31 |
- 따라서 인덱스가 파일에 저장되지 않게 일반적으로 'index = False'를 사용하는 것이 좋다.
② 파일 불러오기
df = pd.read_csv('data.csv')
df
Name | Age | MBTI | Birth | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 |
1 | 김혜윤 | 29 | ISTJ | 1996-11-10 |
2 | 송건희 | 28 | ENFJ | 1997-08-16 |
3 | 이승협 | 33 | ESTP | 1992-10-31 |
4. 새로운 행과 열 추가하기
① 행 추가
df_new = df.loc[len(df)] = ['서혜원', 32, 'INFJ', '1993-11-22']
df_new
Name | Age | MBTI | Birth | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 |
1 | 김혜윤 | 29 | ISTJ | 1996-11-10 |
2 | 송건희 | 28 | ENFJ | 1997-08-16 |
3 | 이승협 | 33 | ESTP | 1992-10-31 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 |
② 열 추가
df_new['Role'] = ['류선재', '임솔', '김태성', '백인혁', '이현주']
df_new
Name | Age | MBTI | Birth | Role | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 | 류선재 |
1 | 김혜윤 | 29 | ISTJ | 1996-11-10 | 임솔 |
2 | 송건희 | 28 | ENFJ | 1997-08-16 | 김태성 |
3 | 이승협 | 33 | ESTP | 1992-10-31 | 백인혁 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 | 이현주 |
5. 특정 데이터 값 추출하기
ⓛ 특정 열 추출
# 시리즈
df_new['Name']
# type(df_new['Name'])
# pandas.core.series.Series
0 변우석
1 김혜윤
2 송건희
3 이승협
4 서혜원
Name: Name, dtype: object
- 괄호를 한 번 하면 시리즈
# 데이터 프레임
df_new[['Name']]
# type(df_new[['Name']])
# pandas.core.frame.DataFrame
Name | |
0 | 변우석 |
1 | 김혜원 |
2 | 송건희 |
3 | 이승협 |
4 | 서혜원 |
- 괄호를 두 번 하면 데이터 프레임
- 두 개 이상의 열을 추출할 경우 무조건 괄호를 두 번 해줘야 한다.
df_new[['Name', 'Role']]
Name | Role | |
0 | 변우석 | 류선재 |
1 | 김혜원 | 임솔 |
2 | 송건희 | 김태성 |
3 | 이승협 | 백인혁 |
4 | 서혜원 | 이현주 |
② 특정 행 추출
- 인덱스 1, 2번 행의 이름과 나이 추출
# loc 활용
df_new.loc[[1, 2], ['Name', 'Age']]
Name | Age | |
1 | 김혜윤 | 29 |
2 | 송건 | 28 |
- 인덱스 1, 4번 행 추출(iloc은 정수 인덱스만 선택 가능)
# iloc 활용
df_new.iloc[[1, 4]]
Name | Age | MBTI | Birth | Role | |
1 | 김혜윤 | 29 | ISTJ | 1996-11-10 | 임솔 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 | 이현주 |
- 30살 이상 행만 추출
# 조건 필터링 1
df_filtered = df_new[df_new['Age'] >= 30]
df_filtered
Name | Age | MBTI | Birth | Role | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 | 류선재 |
3 | 이승협 | 33 | ESTP | 1992-10-31 | 백인혁 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 | 이현주 |
- MBTI가 E로 시작하거나 F가 들어가 있는 사람의 이름과 MBTI 추출
# 조건 필터링 2
df_filterd = df_new[(df_new['MBTI'].str.startswith('E'))|(df_new['MBTI'].str.contains('F'))]
df_filterd[['Name', 'MBTI']]
Name | MBTI | |
0 | 변우석 | ESFJ |
2 | 송건희 | ENFJ |
3 | 이승협 | ESTP |
4 | 서혜원 | INFJ |
6. 특정 행과 열 삭제하기
* drop() 을 사용할 때 원본 데이터 프레임(df_new)에도 drop 결과를 적용하고 싶다면 inplace = True를 추가하면 된다.
① 행 삭제하기
- 인덱스 1번 행 삭제
df_drop = df_new.drop(1)
Name | Age | MBTI | Birth | Role | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 | 류선재 |
2 | 송건희 | 28 | ENFJ | 1997-08-16 | 김태성 |
3 | 이승협 | 33 | ESTP | 1992-10-31 | 백인혁 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 | 이현주 |
- 인덱스 2, 3번 행 삭제
df_drop = df_new.drop([2, 3])
Name | Age | MBTI | Birth | Role | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 | 류선재 |
1 | 김혜윤 | 29 | ISTJ | 1996-11-10 | 임솔 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 | 이현주 |
- 나이가 30살 이하인 행 삭제
df_drop = df_new.drop(df_new[df_new['Age'] <= 30].index)
Name | Age | MBTI | Birth | Role | |
0 | 변우석 | 34 | ESFJ | 1991-10-31 | 류선재 |
3 | 이승협 | 33 | ESTP | 1992-10-31 | 백인혁 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 | 이현주 |
- MBTI가 E로 시작되는 행 삭제
df_drop = df_new.drop(df_new[df_new['MBTI'].str.startswith('E')].index)
Name | Age | MBTI | Birth | Role | |
1 | 김혜윤 | 29 | ISTJ | 1996-11-10 | 임솔 |
4 | 서혜원 | 32 | INFJ | 1993-11-22 | 이현주 |
② 열 삭제하기
- 열 한 개 삭제하기
# axis = 1은 열을 의미
df_drop = df_new.drop('MBTI', axis = 1)
Name | Age | Birth | Role | |
0 | 변우석 | 34 | 1991-10-31 | 류선재 |
1 | 김혜윤 | 29 | 1996-11-10 | 임솔 |
2 | 송건희 | 28 | 1997-08-16 | 김태성 |
3 | 이승협 | 33 | 1992-10-31 | 백인혁 |
4 | 서혜원 | 32 | 1993-11-22 | 이현주 |
- 열 두 개 이상 삭제하기
df_drop = df_new.drop(['MBTI', 'Age'], axis = 1)
Name | Birth | Role | |
0 | 변우석 | 1991-10-31 | 류선재 |
1 | 김혜윤 | 1996-11-10 | 임솔 |
2 | 송건희 | 1997-08-16 | 김태성 |
3 | 이승협 | 1992-10-31 | 백인혁 |
4 | 서혜원 | 1993-11-22 | 이현주 |