Sparta/Theory

[250830] pandas

junecho 2025. 9. 1. 11:11

 

 

파일 불러오기

import pandas as pd
import seaborn as sns

data = sns.load_dataset("tips")     # seaborn에 존재하는 tips 이라는 dataset load
data.to_csv("tips_data.csv")        # tips 를 tip_data.csv로 이 폴더에 저장하겠음
df = pd.read_csv("tips_data.csv")       # df = tips_data.csv 를 읽겠음

print(df)

 

인덱스 생성하지 않기

# 방법1
data.to_csv("tips_data.csv", index=False)
df = pd.read_csv("tips_data.csv")

# 방법2
data.to_csv("tips_data.csv")
df = pd.read_csv("tips_data.csv", index_col=0)

 

 

DataFrame 생성

df = pd.DataFrame({
    "A" : [1, 2, 3],
    "B" : ["A", "B", "C"]
}, index= ["idx3", "idx2", "idx1"])     # df라는 데이터프레임 생성

print(df)

 

df.loc["idx2"]      # 2번째 행에 대한 정보를 다 가져와라

 

df.sort_index()     # 순서 정렬

 

df.set_index("A")       # 인덱스 지정 A라는 컬럼을 인덱스로 쓰겠다

 

df.index = ["ㄱ", "ㄴ", "ㄷ"]       # 인덱스 지정

 

df.reset_index(drop=True)       # 지정한 인덱스 사라지고, 원래의 정수 값의 인덱스 지정

 

 


🔰  컬럼                                                                                                                          

 

data = {
    "name" : ["Alice", "Bob", "Charlie"],
    "age" : ["25", "30", "35"],
    "gender" : ["female", "male", "male"]
}

df = pd.DataFrame(data)     # data 라는 DataFrame 생성

 

df["name"]      # name 컬럼만 출력

 

df.columns = ["이름", "나이", "성별"]       # 컬럼명 변경

 

Rename

df = df.rename(columns={"이름" : "name", "나이" : "age"})       # 컬럼명 변경

 

 

df["스포츠"] = "축구"       # 컬럼 추가

 

del df["스포츠"]        # 스포츠 컬럼 삭제

 

 


🔰  데이터 확인                                                                                                            

 

 

df.head()       # 상위 5개 확인
df.tail()       # 하위 5개 확인

 

df.info()       # 데이터프레임의 정보. 컬럼명, 데이터타입, null값 얼마나 있는지

 

df.describe()       # 기초통계량 확인. 숫자타입 컬럼만 출력됨

 

.isna()

None값 찾기

df = pd.DataFrame({
    "A" : [1, 2, 3, 4],
    "B" : [5, 6, 7, None]
})

df.isna()       # None 값 찾기. None값은 True

 

df[df["B"].isna()]      # B컬럼에서 None값 있는 인덱스 출력

 

.astype()

데이터타입 변환

df["total_bill"] = df["total_bill"].astype(str)     # total_bill 컬럼 데이터타입 str로 변환
df.info()

 

df["total_bill"].astype(float).astype(int)      # 소수점을 정수로 바꾸기

 

 


🔰  데이터 선택                                                                                                          

 

.iloc[]

파이썬 숫자 슬라이싱과 동일. 끝 값 포함❌

df = pd.DataFrame({
    "A" : [1, 2, 3, 4, 5],
    "B" : [10, 20, 30, 40, 50],
    "C" : [100, 200, 300, 400, 500]
})

df.iloc[:]      # 전체 인덱스 값들 불러옴
df.iloc[0]      # 0번째 인덱스 값들 불러옴
df.iloc[0:3]      # 0~2번 인덱스 값들 불러옴
df.iloc[0:5:2]      # 0~4번 인덱스 값 2씩 건너뛰고 불러옴
df.iloc[1, 0:2]     # 1번 인덱스에서 0~2컬럼의 값 불러옴

 

 

.loc[]

인덱스 값으로 슬라이싱. 끝 값 포함⭕

df = pd.DataFrame({
    "A" : [1, 2, 3, 4, 5],
    "B" : [10, 20, 30, 40, 50],
    "C" : [100, 200, 300, 400, 500],
}, index=["aa", "bb", "cc", "dd", "ee"])

df
df.loc["bb":, "B"]      # bb인덱스~마지막 인덱스까지 B컬럼 값 출력
df.loc["bb":"dd", "A":"C"]        # bb인덱스~dd인덱스까지 A~C 컬럼 값 출력
df.loc[:"cc", ["C","A"]]        # 처음부터~cc인덱스까지 C컬럼, A컬럼 출력

 

df[["B", "A"]]      # loc, iloc 없이 [] 로 출력하기. A, B 컬럼 순서 바꿔서 출력

 

 


🔰  불리언 인덱싱                                                                                                     

 

AND( & ) OR( | )

df = pd.read_csv("tips_data.csv" index_col=0)

df[(df["sex"]=="Female") & (df["smoker"] == "Yes")]
df[(df["size"] > 5) | (df["size"] < 2)]

 

.isin()

특정 컬럼에서 특정 값만 출력

df[df["day"].isin(["Sun", "Thur"])]      #day 컬럼에서 Sun, Thur 값만 추출

 

df["revenue"] = df["total_bill"] + df["tip"]    # revenue란 컬럼 추가

 

 


🔰  데이터 병합                                                                                                     

 

concat

아래로 병합

df1 = pd.DataFrame({
    "A" : ["A0", "A1", "A2", "A3"],
    "B" : ["B0", "B1", "B2", "B3"],
    "C" : ["C0", "C1", "C2", "C3"],
    "D" : ["D0", "D2", "D2", "D3"]
})

df2 = pd.DataFrame({
    "A" : ["A4", "A5", "A6", "A7"],
    "B" : ["B4", "B5", "B6", "B7"],
    "C" : ["C4", "C5", "C6", "C7"],
    "D" : ["D4", "D5", "D6", "D7"]
})

df3 = pd.DataFrame({
    "A" : ["A8", "A9", "A10", "A11"],
    "B" : ["B8", "B9", "B10", "B11"],
    "C" : ["C8", "C9", "C10", "C11"],
    "D" : ["D8", "D9", "D10", "D11"]
})

pd.concat([df1, df2, df3])     # 아래로 병합 
pd.concat([df1, df2, df3]).reset_index(drop=True)   # 인덱스정렬

 

concat(axis=1)

옆으로 병합

df1 = pd.DataFrame({
    "A" : ["A0", "A1", "A2", "A3"],
    "B" : ["B0", "B1", "B2", "B3"],
    "C" : ["C0", "C1", "C2", "C3"],
    "D" : ["D0", "D2", "D2", "D3"]
})

df2 = pd.DataFrame({
    "A" : ["A4", "A5", "A6", "A7"],
    "B" : ["B4", "B5", "B6", "B7"],
    "C" : ["C4", "C5", "C6", "C7"],
    "D" : ["D4", "D5", "D6", "D7"]
})

pd.concat([df1, df2], axis=1)       # 옆으로 병합

 

 

merge()

디폴트값 : inner (innerjoin 과 동일)

how=”outer”

how=”left”

df11 = pd.DataFrame({
    "key" : ["A", "B", "C", "D"],
    "value" : [1, 2, 3, 4]
})

df22 = pd.DataFrame({
    "key" : ["B", "D", "D", "E"],
    "value" : [5, 6, 7, 8]
})

df11
df22

 

pd.merge(df11, df22, on="key")      # on="컬럼명" 겹치는 데이터만 가져옴

 

pd.merge(df11, df22, on="key", how="outer")     # 전체 데이터 출력

 

pd.merge(df11, df22, on="key", how="left")     # 왼쪽 즉 df11 기준으로 데이터 출력

 

 


🔰  데이터 집계                                                                                                     

 

groupby

df = pd.DataFrame({
    "Category" : ["A", "B", "A", "B", "A", "B"],
    "Value" : [1, 2, 3, 4, 5, 6]
})
df

 

df.groupby("Category").mean()       # 각 category 별로 가지는 value들의 평균값
df.groupby("Category").sum()       # 각 category 별로 가지는 value들의 합계
df.groupby("Category").count()       # 각 category 별로 가지는 value들의 개수
df.groupby("Category").max()       # 각 category 별로 가장 큰 수
df.groupby("Category").min()       # 각 category 별로 가장 작은 수
df.groupby("Category").first()       # 각 category 별로 첫번째 컬럼

 

df.groupby("Category").agg(list)        # value 값이 리스트로 묶여서 출력

 

# day 별로 숫자형 데이터타입의 컬럼만 평균값 출력
df[["day", "total_bill", "tip", "size"]].groupby("day").mean()

 

# 성별 별로 요일 별로 숫자형 데이터타입의 컬럼 평균값 출력
df[["sex", "day", "total_bill", "tip", "size"]].groupby(["sex", "day"]).mean().round()

 

df[["sex", "day", "total_bill", "tip", "size"]].\
    groupby(["day", "sex"]).\
    agg({"total_bill" : "max", "tip" : "mean", "size" : "sum"})

 

 


🔰  Pivot                                                                                                    

 

df = pd.DataFrame({
    "Date" : ["2023-01-01", "2023-01-01", "2023-01-02", "2023-01-02", "2023-01-01"],
    "Category" : ["A", "B", "A", "B", "A"],
    "Value" : [10, 20, 30, 40, 50]
})
df

 

# 일자별로 각 카테고리의 value 값을 sum한 값 출력
pivot = df.pivot_table(index="Date", columns="Category", values="Value", aggfunc="sum")
pivot

 

3df = pd.DataFrame({
    "Date" : ["2023-01-01", "2023-01-01", "2023-01-02", "2023-01-02", "2023-01-01"],
    "Category" : ["A", "B", "A", "B", "A"],
    "SubCategory" : ["X", "X", "Y", "Y", "X"],
    "Value" : [10, 20, 30, 40, 50]
})
df

 

pivot = df.pivot_table(index="Date", columns=["Category", "SubCategory"], \
                       values="Value", aggfunc="sum")
pivot

 

 


🔰  정렬                                                                                                   

df = pd.DataFrame({
    "Name" : ["Alice", "Bob", "Charlie", "David", "Eva"],
    "Age" : [25, 22, 30, 30, 18],
    "Score" : [85, 88, 83, 90, 92]
})
df

 

sort_values

df.sort_values(by="Age")        # Age 컬럼 기준 오름차순

 

# Age는 오름차순, Score는 내림차순
df.sort_values(by=["Age", "Score"], ascending=[True, False])

 

df.sort_index(ascending=False)      # 인덱스 기준으로 내림차순