Pandas 데이터 수정/분석/시각화 [데이터 사이언스 in Python #4]

이전 포스트(https://citizen.tistory.com/59)와 이어지는 내용입니다.

 

통계 산출


 

describe()

각 필드 정보들의 통계치(평균, 최소/최대, 상위 n%) 등을 나타냅니다. 필드 항목 중 NaN 값이 포함되는 경우 count에서 집계되지 않기도 합니다.

df.describe()

 

특정 필드를 지정하여 통계 산출이 가능합니다.

df['Fuel'].describe()

 

value_counts()

카테고리별 데이터 개수를 반환합니다.

df['Drive'].value_counts()

 

min(), max(), mean()

필드 항목에서의 최소, 최대, 그리고 평균값을 반환합니다.

print(df['Price'].min(), df['Price'].max(), df['Price'].mean())

 

corr()

필드 간의 상관관계를 표로 나타냅니다. 표 안의 수치들은 피어슨 상관 계수(Pearson correlation coefficient)으로 표시되며, 1에 가까울수록 양의 상관관계를, -1에 가까울수록 음의 상관관계를 갖습니다.

df.drop(['Unnamed: 0'], axis = 1, inplace = True) # 우선 필요없는 열을 지웁니다.
df.corr()

 

데이터 수정


 

열 추가

df[’새로 추가할 열의 이름’] = List of items 형태로 기존에 없던 열을 추가할 수 있습니다. 만약 필드명이 기존에 있던 것과 일치하면, 해당 column을 새로 제공한 값으로 덮어씌워버립니다.

data = {
    'Car Name': ['Maruti S PRESSO', 'Hyyndai Xcent', 'Tata Safari'], # 1번째 열
    'Year': [2022, 2018, 2021], # 2번째 열
    'Distance': [3878, 32041, 96339], # 3번째 ...
    'Owner': [1,1,1],
    'Fuel': ['PETROL', 'PETROL', 'DIESEL'],
    'Location': ['HR-98', 'TN-22', 'TS-08'],
    'Drive': ['Manual', 'Manual', 'Automatic'],
    'Type': ['HatchBack', 'Sedan', 'SUV'],
    'Price': [514000, 674000, 1952000]
}

df = pd.DataFrame(data)

new_col = ['Y', 'Y', 'N']
df['On Sale'] = new_col
df

 

열 삭제

drop() 메서드를 이용하여 지정된 열을 삭제합니다.

df.drop(['Owner', 'Location'], axis = 1, inplace = True)
df

 

행추가/데이터 프레임 병합

data1 = {
    'Car Name': ['Maruti S PRESSO', 'Hyyndai Xcent', 'Tata Safari'],
    'Year': [2022, 2018, 2021],
    'Distance': [3878, 32041, 96339],
    'Fuel': ['PETROL', 'PETROL', 'DIESEL'],
    'Drive': ['Manual', 'Manual', 'Automatic'],
    'Type': ['HatchBack', 'Sedan', 'SUV'],
    'Price': [514000, 674000, 1952000]
} 

data2 = {
    'Car Name': ['Renault Kiger', 'Maruti BREZZA'],
    'Year': [2022, 2022],
    'Distance': [1024, 3292],
    'Fuel': ['PETROL', 'PETROL'],
    'Drive': ['Manual', 'Manual'],
    'Type': ['HatchBack', 'SUV'],
    'Price': [727000, 1427000]
}

df1 = pd.DataFrame(data1)
df2 = pd.DataFrame(data2)
df = pd.concat([df1, df2], ignore_index=True)
df

 

정렬

특정 열을 기준으로 정렬합니다.

# "Year" 필드를 기준으로 오름차순 정렬
# na_position: NaN 값이 제일 앞('first')에 올지, 제일 뒤('last')로 갈지 결정
df = pd.read_csv('cars.csv')
df.sort_values("Year", ascending = True, inplace = True, na_position ='last')
df

 

기준을 여러 개로 설정할 수 있고, 오름차순/내림차순 여부도 따로따로 정하는 게 가능합니다.

# 'Year' 필드 기준으로 오름차순 후, 'Distance' 필드 기준으로 내림차순 정렬
df.sort_values(["Year", "Distance"], ascending = [True, False], inplace = True)
df

 

isna()

간혹 데이터를 훑어보면 일부 필드값이 누락되어 있는 경우가 종종 있습니다. 해당 필드는 대게 NaN이라는 문자열이 대신 표시되는데요. 이러한 NaN 값이 포함된 행을 찾을 때 사용하는 메서드가 isna입니다.

df[df['Car Name'].isna()]

 

dropna()

NaN, 또는 비어있는 필드를 가진 행들을 모두 삭제하는 메서드입니다.

df = pd.read_csv('cars.csv')
df.dropna(inplace=True)
df

원래 8016개였던 데이터에서 200개 가량의 샘플이 제거되었습니다.

 

fillna()

NaN에 해당하는 값을 다른 것으로 대체합니다.

df = pd.read_csv('cars.csv')
df['Year'].fillna(2020, inplace=True)

 

astype()

필드의 데이터형을 변환하는 메서드입니다.

df['Year'] = df['Year'].astype('int32')
df

 

apply()

특정 열에 lambda 연산을 수행합니다.

df['Price'] = df['Price'].apply(lambda x : x//1000)
df

 

# 데이터 전처리 시에 범주형 데이터를 0,1,2 ... 등의 정수로 변환하곤 합니다.
# 아래는 'Drive' 유형이 'Manual'일 경우 1로, 그 외에는 0으로 마킹하는 코드입니다.
df['Drive'] = df['Drive'].apply(lambda v: 1 if v == 'Manual' else 0)
df

 

replace()

df['Type'].replace(['HatchBack', 'Sedan', 'SUV'], [0, 1, 2], inplace=True)
df

 

to_numpy()

numpy ndarray로 변환된 값을 리턴하는 메서드입니다.

arr = df.to_numpy()
print(type(arr)) # <class 'numpy.ndarray'>

 

시각화


 

자체 내장함수

 

hist()

히스토그램 그래프를 시각화합니다.

df = pd.read_csv('cars.csv')
df['Type'].hist()

 

plot.scatter()

산포도를 그려줍니다.

df2 = df[:200]
df2.plot.scatter(x='Distance', y='Price')

 

seaborn 패키지와 연계하여 시각화

더욱 정밀하고 유용한 그래프를 그리기 위해 seaborn과 같은 타 패키지를 동시에 활용하기도 합니다.

 

kdeplot()

필드값의 분포도를 그려줍니다.

import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline

sns.kdeplot(df['Price'], color='b', shade=True, Label='Price')

 

heatmap()

필드 간의 상관관계를 시각화하고자 할때 주로 사용되는 함수입니다.

sns.heatmap(df.corr(), annot=True, vmin=-1, vmax=1, linewidths=0.2, cmap='seismic')

 

반응형