이전 포스트(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
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')