제로 베이스: 서울시 CCTV 현황 데이터 분석
import pandas as pd
from Module import function
CCTV_Seoul = pd.read_csv(
"../data/01. Seoul_CCTV.csv",
endoding="utf-8"
)
< pandas dataframe 구조 >

# column 이름 조회
CCTV_Seoul.columns
CCTV_Seoul.columns[0]
# df.rename: column 이름 변경하기
# inplace => 실제로 데이터의 column 이름을 바꾸겠다, default가 False임.
# header=2: 위에서 2번 줄이 header라고 명시
# usecols= : 필요한 컬럼만 선택
pd.Series([1,2,3,4]) #dtype: int64
pd.Series([1,2,3,4], dtype=np.float64) #dtype: float64
pd.Series([1,2,3,4], dtype=str) #dtype: object
pd.Series(np.array([1,2,3])) #dtype: int64
data = pd.Series([1,2,3,4, "5"]) #dtype: object
pd.date_range("날짜", periods=n) 로 입력한 날짜로부터 n일 간의 날짜 생성# 20240501부터 기준으로 6일간의 데이터가 생성됨.
dates = pd.date_range("20240501", periods=6)
dates
...
DatetimeIndex(['2024-05-01', '2024-05-02', '2024-05-03', '2024-05-04',
'2024-05-05', '2024-05-06'],
dtype='datetime64[ns]', freq='D')
pd.DataFrame() : values, index, columns로 구성import numpy as np
df = pd.DataFrame(
np.random.randn(6,4),
# numpy 내장함수로 6행 4열(총 24개)의 랜덤요소 생성
index=dates,
columns=["A", "B", "C", "D"]
)
df.head() #위에서부터 기본 5개, 숫자 지정도 가능
df.tail() #아래에서부터 기본 5개, 숫자 지정도 가능
df.index #index 가져오기
df.columns #columns 가져오기
df.values #values 가져오기
df.info() #데이터 프레임의 기본 정보 확인: 컬럼의 크기와 데이터 형태 확인
df.describe() #데이터 프레임의 기술 통계 정보 확인 (count, mean, std, min, max, 25%, 50%, 75%)
sort_values(): 특정 컬럼(열)을 기준으로 데이터를 정렬한다.df.sort_values(by="B", ascending=False, inplace=True)
df["A"] #index와 A컬럼의 value 출력
type(df["A"]) #pandas.core.series.Series
df.A #컬럼명이 알파벳이면 'A'로 아예 지정해서 불러올 수도 있음 (숫자X)
# 리스트 안에 리스트로 또 담아줘야 함
df[["A", "B"]]
[n:m]: n부터 m-1까지df[0:3]
# 1번째 행부터 3번째 행까지만 불러와짐
df["2024-05-01":"2024-05-04"]
# 1번째 행부터 4번째 행까지 불러와짐. 즉 끝이라고 지정한 행까지 불러와짐.
loc[]: locationdf.loc[:, ["A", "B"]]
# 인덱스는 전부 다 가져오고, 컬럼은 A,B만 가져와라
df.loc["2024-05-01":"2024-05-04", ["A", "D"]]
#1번째 행부터 4번째 행까지, A와 D 컬럼만 불러와짐.
df.loc["2024-05-01":"2024-05-04", "A":"D"]
# 컬럼에서 offset index 활용해서 A부터 D까지 불러옴. 즉, D컬럼이 포함됨!
iloc[]: integer locationdf.iloc[3] # 3번째 행의 데이터
df.iloc[3,2] #3번째 행, 2번째 컬럼의 데이터만 불러와짐
df.iloc[1:3, 1:3] # 1~2행, 1~2열만 불러와짐. 즉, 3번째 행과 3번째 열이 빠졌음.
df.iloc[:, 1:3] # 모든 행, 1~2컬럼만 불러옴.
df[df["A"]>0]
# 값이 0보다 큰 것만 불러오고, 0보다 작은 값의 자리에는 NaN(Not a Number, 데이터가 없다는 뜻)가 들어감.
isin(): 특정 요소가 있는지 확인df["E"] = ["one", "two", "three", "four", "five", "six"] # 컬럼 E를 추가
df[df["E"].isin(["two","five"])] #E컬럼의 값이 two, five인 데이터 불러오기
del 삭제할 컬럼drop(삭제할 컬럼, axis=)del df["E"] #E컬럼 삭제
df.drop(["D"], axis=1) #D컬럼 삭제
apply(함수) 데이터에 특정 함수를 적용시킴df["A"].apply("sum")
df["A"].apply("mean")
df["A"].apply("min"), df["A"].apply("max")
df.apply(np.sum) #전체 컬럼에 대한 sum
df["A"].apply(np.cumsum) # A컬럼의 누적 합
# 직접 함수를 만들어보고 데이터 프레임에 적용해보기
def plusminus(num):
return "plus" if num > 0 else "minus"
df["A"].apply(plusminus)
...
2024-05-01 minus
2024-05-02 minus
2024-05-03 plus
2024-05-04 minus
2024-05-05 minus
2024-05-06 plus
Pandas에서 데이터 프레임을 병합하는 방법 3가지

# 딕셔너리 안의 리스트 형태
left = pd.DataFrame({ # 컬럼의 값을 순서대로 나열
"key": ["K0", "K4", "K2", "K3"],
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"]
})
# 리스트 안의 딕셔너리 형태: 행의 값을 순서대로 나열
right = pd.DataFrame([
{"key": "K0", "C":"C0", "D": "D0"},
{"key": "K1", "C":"C1", "D": "D1"},
{"key": "K2", "C":"C2", "D": "D2"},
{"key": "K3", "C":"C3", "D": "D3"},
])

pd.merge(left, right, on="key")
# key 컬럼을 기준으로 left와 right 데이터 프레임을 합치겠다
# #how의 디폴트: inner -> key 컬럼에서 공통으로 가지고 있는 값에 대해서만 합쳐짐

pd.merge(left, right, how="left", on="key")
# key 컬럼을 기준으로 left와 right 데이터 프레임을 합치겠다
# 하지만 left에 있는 값을 기준으로 합쳐라
# right에는 존재하지 않는 K4 행의 값이 NaN

pd.merge(left, right, how="right", on="key")
# key 컬럼을 기준으로 left와 right 데이터 프레임을 합치겠다
# 하지만 right에 있는 값을 기준으로 합쳐라
# left에는 존재하지 않는 K1 행의 값이 NaN

pd.merge(left, right, how="outer", on="key")
# key 컬럼을 기준으로 left와 right 데이터 프레임을 합치겠다
# 하지만 outer인 합집합으로서, key에 있던 없던 다 합쳐라
# left에는 존재하지 않는 K1 행의 값이 NaN, right에는 존재하지 않는 K4 행의 값이 NaN
set_index(): 선택한 컬럼을 데이터 프레임의 인덱스로 지정data_result.set_index("구별", inplace=True)
data_result.head()

