Python: Data — Pandas

Seungwoo Shin
7 min readMay 31, 2024

--

판다스는 파이썬 내에 있는 패키지이다. 데이터를 다룰 때 사용한다. 판다스에서 지원하는 데이터 형태는 테이블 형식이다. 엑셀 형태를 생각하면 된다.

Series(행 또는 열), Index, row(행, 관측치 정보 입력), Column(열, 또는 Feature-변수로 지칭하기도 함), 독립변수, 종속변수 개념을 이해할 수 있다.

주로 사용하는 메소드는 .describe(통계제공), .apply(함수적용), .sort_values(정렬), .tail(끝에서부터 데이터 반환, 최신 데이터셋 확인 목적), .replace(특정 값이 대체), pd.to_numeric(데이터를 숫자형으로 변환), get_dummies(이진 0, 1 열을 생성), Aggregation, .merge, .value_counts 등

# drop function

data.drop('Name', axis=1) # data에 있는 'Name' Series 삭제. 데이터는 미삭제
data.drop('Name', axis=1, inplace=True) # data 내 데이터까지 삭제
data.drop(2) # 2번째 row 삭제. axis=0으로 기본 셋팅되어서 지정하지 않아도 됨
data.drop(['Pclass','Age'], axis = 1) # 동시에 삭제시에는 리스트로 묶어줘야 함
# loc vs. iloc function

data.loc[5]
data.loc[4:]
data.loc[[3,4,5]] # 인덱스 이름을 불러오는 것임. 순서가 아님
data.iloc[[2,3,4]] # iloc은 순서대로 불러오는 것임
# 결측치. 관측되지 않은 값. NULL, NaN, np.NaN, NA 등으로 표현한다

data.isna() # 결측치가 있는지 확인
data.isna().sum() # 결측치 값들을 합산
data.isna().mean() # 결측치 값들의 비율을 확인. 비율이 보는 것이 더 중요

data[data['Age'].isna()].index # 결측치가 있는 인덱스를 리스트로 출력

data.dropna() # 결측치 삭제. 노이즈를 발생하지 않게 하기 위해서 삭제하는게 제일 좋음

data['Age'].fillna(data['Age'].mean()) # 평균값 대체
data['Age'].fillna(data['Age'].median()) # 중간값 대체. 아웃라이어 배제

아웃라이어는 data.describe()를 통해서 min 값이나 max 값을 보면서 판단을 해줄 수 있다. 이 때, sort_values()를 활용할 수 있다.

# 아웃라이어 처리 방법
data.describe()

data['Age'].sort_values() # 오름차순으로 보여줌
data['Age'].sort_values(ascending=False) # 내림차순으로 보여줌

아웃라이어를 시각적으로 파악하는 방법도 있다.

# matplot과 seaborn이 많이 쓰임

import matplotlib.pyplot as plt
import seaborn as sns

sns.displot(data['Age']) # 막대그래프를 그려줌
sns.scatterplot(x = data.index, y = data['Age']) # 점도표를 그려줌
sns.boxplot(data['Age']) # 상자 그림 그려줌
displot
scatterplot (140을 넘어가는 데이터는 확인해봐야 한다)
scatterplot (8이라는 데이터는 여러 번 관측되었기 때문에 아웃라이어라고 보기 어려울 수 있다)
boxplot

lambda를 활용해서 조건에 맞는 데이터를 조정할 수 있다.

# 나이가 30 초과면 30으로 리턴, 30과 같거나 작으면 원래 값을 리턴, 오름차순 정렬

data['Age'].apply(lambda x: 30 if x > 30 else x).sort_values()

중복 데이터를 처리하는 기능이 있다.

data.duplicated()  # 중복 데이터를 보여줌
data[data['Name'] == 'Palsson, Miss. Torborg Danira'] # 데이터 찾기
data.drop_duplicated() # 중복 데이터를 제거해줌

# 데이터 이름 바꿔주기
data['Embarked'].replace({'S': 'South', 'C': 'Cherb', 'Q': 'Queens'})

# replace 판다스 Series, DataFrame 다 작동하는데, map은 Series만 작동함
data['Embarked'].map({'S': 'South', 'C': 'Cherb', 'Q': 'Queens'})

map은 function을 활용해서 데이터의 맵핑이 가능하다. apply도 동일하게 활용할 수 있으며, 차이는 DataFrame 모두에도 사용 가능하다.

data['Gender'].map(len)
data['Gender'].apply(len)

텍스트 처리도 가능하다.

test_txt.split() # 띄어쓰기 기준으로 나눠줌, 리스트로 저장
test_txt.strip() # 문자열 맨 앞의 공백을 제거

data['Ticket'][-5:] # Ticket이 있는 칼럼의 끝에서 5개 데이터 출력
data['Ticket'].str[-5:] # Ticket 칼럼 내 값의 뒤에서 5개 문자열 출력

data['Ticket'].str.split(expand = True)[0] # 공백기준으로 분할후 [0] 출력
data['new ticket'] = data['Ticket'].str.split().apply(lambda x: x[-1])
data['new ticket'].str.isdigit() # 데이터가 숫자면 True 값 리턴
~data['new ticket'].str.isdigit()# 데이터가 숫자면 False 값 리턴

data['new ticket'].astype('int') # 정수 값만 출력
pd.to_numeric(data['new ticket'])

날짜 처리도 가능하다.

from datetime import datetime

sample = datetime.strptime('2023-01-01', '%Y-%m-%d') # datetime 양식으로 저장
datetime.strftime(sample_date, '%y-%b-%d') # 저장된 값을 출력

# 변수의 타입을 datetime으로 변경하기
data['ticket_date'] = pd.to_datetime(data['ticket_date'])
data['ticket_date'].dt.year

acc = datetime.strptime('1912-04-15', '%Y-%m-%d')
data['buy_before'] = acc - data['ticket_date']
data['buy_before'] = data['buy_before'].dt.days
data['buy_before'] + 10

start = datetime.strptime('2022-11-24', '%Y-%m-%d')
end = datetime.strptime('2023-03-15', '%Y-%m-%d')
print((end - start).days)

--

--