판다스

주홍땅·2025년 7월 3일

데이터 분석

목록 보기
2/5
post-thumbnail

📌 판다스
: 판다스는 데이터 분석을 위한 파이썬 라이브러리 중 하나로, 표 형태의 데이터나 다양한 형태의 데이터를 쉽게 처리하고 분석할 수 있도록 도와주는 도구
: 주로 데이터프레임이라는 자료구조를 제공


📌 Series와 DataFrame

  • Series
    : 1차원 배열과 같은 자료구조로 하나의 열을 나타냄
    : 각 요소는 index와 value로 구성되어 있음
idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
data = [67, 75, 90, 62, 98]
se1 = pd.Series(data,idx)
se1
  • DataFrame
    : 2차원의 테이블 형태 데이터를 다루는데 사용됨
    : 각 요소는 index, column, value로 구성되어 있으며 행과 열로 이루어져 있음
data = [[67, 93, 91],
        [75, 68, 96],
        [87, 81, 82],
        [62, 70, 75],
        [98, 56, 87]]

idx = ['김사과', '반하나', '오렌지', '이메론', '배애리']
col = ['국어', '영어', '수학']
df = pd.DataFrame(index=idx, columns=col, data=data)
# 딕셔너리를 사용하여 데이터프레임을 생성
dic = {
    '국어':[67, 75, 76, 62, 98],
    '영어':[93, 68, 81, 70, 56],
    '수학':[91, 96, 82, 75, 87]
}

df = pd.DataFrame(data = dic, index=idx)

📌 DataFrame 기본 정보 알아보기

df.info()
df.columns()
df.describe() # 통계 정보를 반환
df.describe(include=object) # top : 최빈값, freq : 최빈값의 빈도
df.head() # 상위 5개의 row를 출력
df.tail() # 하위 5개의 row를 출력
df.sort_index() # index로 오름차순 정렬
df.sort_index(ascending=False) # index로 내림차순 정렬 
df.sort_values(by="height", ascending=False) # 키라는 value값으로 내림차순 정렬
df.sort_values(by="height") # 키로 오름차순 정렬
# 키로 내림차순 정렬, NaN을 위로 올림
df.sort_values(by="height", ascending=False, na_position="first")
# 1차 정렬 : 키, 2차 정렬 : 브랜드
# 둘 다 내림차순 정렬하며 NaN을 위로 올림
df.sort_values(by=["height","brand"], ascending=[False,False], na_position="last")

📌 데이터 다루기

df["blood"] # df.blood와 동일한 기능
type(df["blood"]) # 출력값은 시리즈겠죠?
df["blood"] # df.blood와 동일한 기능
df.loc[:,"name"] # loc 인덱싱 기능이며 df["name"]과 동일한 기능
df.loc[2:5, "name"] # 인덱스 번호 2~5번인 name 열 출력 
df.loc[2:5, ["name", "gender", "height"]] 
# 인덱스 번호 2~5번인 name,gender,height 열 출력 
df.loc[[2,5], ["name", "gender", "height"]] 
# 인덱스 번호 2,5번인 name,gender,height 열 출력 
df.iloc[:,0] # iloc 인덱싱 기능이며 인덱스 0번에 해당하는 열 출력
df.iloc[:,0:3] # loc 인덱싱과 다르게 3번 인덱스를 포함하지 않음
df.iloc[:,[0,3]] # 0,3번 인덱스에 해당하는 열 출력
df.iloc[1:5,0:2] # 1~4번 인덱스에 해당하는 행 출력, 0~1에 해당하는 열 출력
df["height"] >= 180 # 180을 넘으면 True, 안넘으면 False
df[df["height"] >= 180] # 조건에 맞게 출력
df[df["height"] >= 180]["name"] 
# df["name"][df[height"] >= 180]도 가능함
df.loc[df["height"] >= 180, ["name", "gender", "height"] 
# 조건을 걸어주는 구조다 보니 loc 인덱싱도 사용 가능함
company = ["빅히트", "어도어"]
df["company"].isin(company)
# 회사에 해당하면 True, 아니면 False
df[df["company"].isin(company)]
df.loc[df["company"].isin(company), :]

📌 결측값
: 결측값은 값이 누락된 데이터를 의미하며, 판다스에서는 NaN으로 표시된다

df.isna() # NaN이 True
df.isnull() # isna와 동일한 기능
df.notnull() # NaN이 False
df[df["height"].isna()]
df[df["height"].isna()]["name]
df[df["height"].notnull()]
# df[~df["height"].isnull()]와 동일함
# fillna() : 결측값을 채워넣는 함수
df["height"].fillna(0)
# df["height"].fillna(0) : 결측값을 0으로 채워서 데이터를 변화
height = df["height"].mean() # 평균
df["height"] = df["height"].fillna(height)
height = df["height"].median() # 50%값, 중위값
# dropna() : 결측값이 있는 행 또는 열을 제거 (한개라도 존재하면 삭제)
# axis = 0 (행 삭제, 기본값)
df.dropna()
df.dropna(axis = 1) # 열 삭제

📌 2차원에서 Numpy와 Pandas axis(축) 개념

axis=0 → 세로 방향, 열 기준 연산
axis=1 → 가로 방향, 행 기준 연산

  • sum(axis=0) : 열끼리 더함, 각 열의 합
  • sum(axis=1) : 행끼리 더함, 각 행의 합
  • drop(axis=0) : 특정 행 삭제, 행 기준 drop
  • drop(axis=1) : 특정 열 삭제, 열 기준 drop
  • mean(axis=1) : 각 행의 평균, 가로 방향 연산

📌 행, 열 추가 및 삭제

# concat() : 데이터를 합침, axis = 0 (행, 기본값)
pd.concat([df1, pd.DataFrame(df2, index=[0])], ignore_index = True)
# 행 제거하기
df.drop(20, axis=0) # 20은 행을 기준으로 한 인덱스 번호임
df.drop([1,3,5,7,20], axis=0)
# 열 제거하기
df.drop("nation", axis=1)
df.drop(["nation","group"], axis=1)

📌 통계 함수

df["height].sum()
df["height"].count()
df["height"].mean() # 평균
df["height"].median() # 중앙값
df["height"].max()
df["height"].min()
df["height"].var() # 분산
df["height"].std() # 표준편차

📌 그룹

# groupby() : 데이터를 그룹으로 묶어 분석할 때 사용
df.groupby("group")
df.groupby(["blood", "gender"]).mean(numeric_only=True)
df.groupby(["blood", "gender"])["height"].mean()

📌 중복값 제거하기

# drop_duplicates() : 중복된 데이터를 제거
df["blood"].drop_duplicates()
# value_counts() : 열의 각 값에 대한 데이터의 개수를 반환
# 기본은 NaN을 생략
df["blood"].value_counts()
df["company"].value_counts(dropna=False)

📌 데이터프레임 합치기

# reset_index() : 인덱스를 새롭게 적용
# drop=True 옵션을 사용하여 기존 index가 컬럼으로 만들어지는 것을 방지
df_concat = pd.concat([df1, df2])
df_concat.reset_index(drop=True)
pd.concat([df1,df2], axis=1) # 같은 index와 결합
# merge() : 특정 고유한 키(unique, id) 값을 기준으로 합침
# merge(데이터프레임1, 데이터프레임2, on="유니크값", how="병합의 기준")
# 병합의 기준 : left, right, inner, cross
pd.merge(df1, df2, on="이름", how="left")
pd.merge(df1, df2, on="이름", how="inner") # 교집합
pd.merge(df1, df2, on="이름", how="cross") # 데이터 * 데이터
# pd.merge(df1, df2, on="이름", how="inner") keyError : "이름"
pd.merge(df1, df2, left_on='이름', right_on='성함', how='inner')

📌 등수 매기기

# rank() : 데이터프레임 또는 시리즈의 순위를 매기는 함수, 기본값은 ascending
df1["브랜드순위"] = df1["브랜드평판지수"].rank()
# 브랜드 순위는 브랜드평판지수에서 나온 파생변수
df1["브랜드순위"] = df1["브랜드평판지수"].rank(ascending=False)
# astype() : 특정열의 자료형을 변경
df1["브랜드순위"] = df1["브랜드순위"].astype(int)
print(type(df1))
print(type(df["브랜드순위"]))
print(df1["브랜드순위"].dtypes)
dtypes :(column)의 데이터 타입을 확인할 때 사용하는 속성

📌 날짜타입 사용하기

# to_datetime() : object 타입에서 datetime 타입으로 변환
df["birthday"] = pd.to_datetime(df["birthday"])
print(df["birthday"].dtypes)
df["birthday].dt.year
df["birthday].dt.month
df["birthday].dt.day
df["birthday].dt.hour
df["birthday].dt.minute
df["birthday].dt.second
df["birthday].dt.dayofweek # 요일 : 0(월요일) ~ 6(일요일)
df["birthday"].dt.isocalendar().week

📌 Apply 사용하기
: apply() 함수는 데이터프레임이나 시리즈의 데이터를 사용자 정의 함수 또는 내장 함수에 적용하여 새로운 값을 계산하거나 변환할 때 사용됨. 데이터를 행(row) 또는 열(column) 단위로 처리할 수 있음

# 성별을 남자는 1, 여자는 0으로 변환 (loc를 사용)
df.loc[df["gender"] == "남자", "gender"] = 1
df.loc[df["gender"] == "여자", "gender"] = 0
def male_or_female(x):
  if x == "남자":
    return 1
  elif x == "여자":
    return 0
  else:
    return None
df["gender"].apply(male_or_female) # 콜백함수 원리 이용
df["gender"].apply(lamda x:1 if x=="남자" else 0) # 람다함수 원리 이용
df["NewGender"] = df["gender"].apply(lambda x:1 if x == "남자" else 0)

📌 map 사용하기
: map() 함수는 Series 객체에서 사용할 수 있는 함수로, 각 요소에 대해 함수나 매핑 규칙을 적용하여 새로운 값을 계산하거나 변환할 때 사용됨. map()은 데이터의 각 요소를 순회하며 특정 작업을 수행하므로, 데이터를 가공하거나 변환하는 데 유용함.

map_gender = {"남자 : 1, "여자" : 0}
df["gender"].map(map_gender)
df['NewGender'] = df['gender'].map(map_gender)

📌 데이터프레임의 산술연산

df1 = pd.DataFrame({
    '파이썬':[60, 70, 80, 90, 95],
    '데이터분석':[40, 60, 70, 55, 87],
    '머신러닝딥러닝':[35, 40, 30, 70, 55]
})
df1["파이썬"].dtypes
type(df1['파이썬'])
df1['총점'] = df1['파이썬'] + df1['데이터분석'] + df1['머신러닝딥러닝']
df1['평균'] = df1['총점'] / 3
df1["파이썬"].sum()
df1["파이썬"].mean()
df1.sum()
df1.mean()

📌 select_dtypes

df.select_dtypes(include="object")
# 문자열 컬럼만 가져오기
# 학습을 시킬때 숫자로 바꿀만한거 골라내기 위해서
df.select_dtypes(exclude="object")
str_cols = df.select_dtypes(include="object").columns

📌 get_dummies
: get_dummies()는 범주형 데이터를 원-핫 인코딩(one-hot encoding) 방식으로 변환하는 데 사용됨.

blood_map = {"A":0, "B":1, "AB":2, "O":3}
df["blood_code"] = df["blood"].map(blood_map) # 라벨 인코딩(문자 -> 숫자)
pd.get_dummies(df["blood"])
df = pd.get_dummies(df, columns=["blood"])
profile
공부 기록 글입니다.

0개의 댓글