본문 바로가기
데이터분석

파이썬 판다스

by asd135 2024. 10. 14.
728x90

판다스

데이터 구조인 시리즈(Series), 데이터프레임(DataFrame) 제공

 

시리즈

1차원 배열 형태의 데이터 구조, 각 데이터에 인덱스가 부여되며 숫자, 문자열, 불리언 등 다양한 데이터 타입 저장가능

import pandas as pd

# 시리즈 생성
data = pd.Series([10, 20, 30, 40], index=['가', '나', '다', '라']) 
# 데이터와 인덱스가 서로 매핑되기 때문에 길이가 일치해야함

print(data)

# 인덱스를 사용한 접근
print(data['나'])  # 20

 

데이터프레임

2차원 배열 형태의 데이터 구조, 행과 열로 구성

각 열은 서로 다른 데이터 타입을 가질 수 있으며, 데이터베이스 테이블과 유사

 

딕셔너리 형태

각 키는 데이터프레임의 열 이름
각 키에 해당하는 값은 또 다른 딕셔너리로 이 딕셔너리의 키는 인덱스가 되고, 값은 해당 인덱스의 데이터가 된다.

df = pd.DataFrame({
    '키1': {
        '인덱스0': '값1',
        '인덱스1': '값2'
    },
    '키2': {
        '인덱스0': '값3',
        '인덱스1': '값4'
    }
})


# 데이터프레임 생성
df = pd.DataFrame({
    '이름': {
        '0': '한빛',
        '1': '한결'
    },
    '성별': {
        '0': '남자',
        '1': '남자'
    }
})

print(df)

# 딕셔너리는 기본적으로 열(column) 중심으로 사용

 

리스트 형태

list1 = list([['한빛', '남자'] ,['한결', '남자']])
col_names = ['이름', '성별']
pd.DataFrame(list1, columns=col_names)

#   이름	성별
# 0	한빛	남자
# 1	한결	남자
# 리스트는 기본적으로 행(row)중심으로 사용

 

배열 형태

#배열
arr1 = np.array([['한빛','남자'], ['한결','여자']])
#열 이름 리스트
col_names = ['이름', '성별']
#데이터프레임 생성하기
pd.DataFrame(arr1, columns=col_names)
#넘파이의 행렬은 기본적으로 행(row) 중심으로 사용)

 

데이터 조회, iloc 함수

loc 함수를 사용하여 인덱스로 데이터를 조회할 수 있음.

 

# 딕셔너리로 열단위의 데이터프레임 생성
data = { '이름': ['한빛', '한결'], '성별': ['남자', '여자'], '나이': [25, 24] } 
df = pd.DataFrame(data)
print(df.iloc[1:2, 0:])
#    이름  성별  나이
# 1  한결  여자  24

 

문자열 조회

import pandas as pd
# 예시 데이터프레임
data = { '이름': ['한빛', '한결'], '성별': ['남자', '여자'], '나이': [25, 24]}
df = pd.DataFrame(data)
# '이름'이 '한빛'인 행 출력
print(df[df['이름'] == '한빛'])

 

df['이름']은 데이터프레임의 '이름' 열을 선택하여 시리즈를 생성

0    한빛
1    한결
Name: 이름, dtype: object

 

시리즈의 각 요소에 대해 '한빛'과 비교 후 불리언 배열을 생성

0     True
1    False
Name: 이름, dtype: bool

 

데이터프레임 df의 각 행에 대해 불리언 배열의 값이 True인 경우에만 그 행을 선택함

 

조건 조회

list1 = [
    ['자기이름', '남자', 30, 183],
    ['이가원', '여자', 24, 162],
    ['배규민', '남자', 23, 179],
    ['고고림', '남자', 21, 182]
]
col_names = ['이름', '성별', '나이', '키']
df = pd.DataFrame(list1, columns=col_names)

print(df[df['키'] > 182]) #=> 키가 182이상인 행을 조회하여 출력.
print(df[df['이름'].str.contains('고')]) #=> 이름에 ‘고’가 들어간 행을 조회하여 출력.

 

키를 비교하는 코드도 위와 비슷한 방식으로 동작

0    183
1    162
2    179
3    182
Name: 키, dtype: int64

 

0     True
1    False
2    False
3    False
Name: 키, dtype: bool

 

 

데이터 수정,  loc 함수

dataframe.loc[행 인덱스, 열 이름] = 새로운 값

 

df.loc[3,'키'] = df.loc[3,'키'] + 5 #3행의 키열의 값을 5을 증가
print(df.loc[[3]] ) #대괄호 [[3]]를 사용하여 리스트 형태로 인덱스를 지정하면 해당 행이 데이터프레임 형태로 출력

 

iloc와 loc의 데이터 추출 비교

 

iloc

import pandas as pd
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]}
df = pd.DataFrame(data)
# 첫 번째 행, 두 번째 열에 있는 값을 가져오기
print(df.iloc[0, 1]) # 결과: 4

 

loc

import pandas as pd
data = {'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 
9]}
df = pd.DataFrame(data)
# 인덱스와 컬럼 레이블로 접근
print(df.loc[0, 'B']) # 결과: 4

 

iloc와 loc의 슬라이싱 차이점

iloc 슬라이싱은 마지막 인덱스를 포함하지 않음

loc 슬라이싱은 마지막 인덱스를 포함

 

'데이터분석' 카테고리의 다른 글

이상치  (1) 2024.11.27
결측치  (0) 2024.11.26
파이썬 맷플롯립(Matplotlib)  (0) 2024.10.20
파이썬 넘파이(NumPy)  (0) 2024.10.14
웹 크롤링  (0) 2024.09.23