import pandas as pd
import numpy as np
import seaborn as sns
df = sns.load_dataset("iris") #연습용 데이터셋(iris) 호출
>>>
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
... ... ... ... ... ...
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
1.1. column별 정보
df.info() #데이터의 수, 타입(Dtype) 조회
>>>
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 150 entries, 0 to 149
Data columns (total 5 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 sepal_length 150 non-null float64
1 sepal_width 150 non-null float64
2 petal_length 150 non-null float64
3 petal_width 150 non-null float64
4 species 150 non-null object
dtypes: float64(4), object(1)
memory usage: 6.0+ KB
1.2. column별 통계 정보
df.describe() #각 column별 통계 정보 조회(numerical만 해당)
>>>
sepal_length sepal_width petal_length petal_width
count 150.000000 150.000000 150.000000 150.000000
mean 5.843333 3.057333 3.758000 1.199333
std 0.828066 0.435866 1.765298 0.762238
min 4.300000 2.000000 1.000000 0.100000
25% 5.100000 2.800000 1.600000 0.300000
50% 5.800000 3.000000 4.350000 1.300000
75% 6.400000 3.300000 5.100000 1.800000
max 7.900000 4.400000 6.900000 2.500000
df.describe(include='object') #Dtype = object에 대한 통계 정보
>>>
species
count 150
unique 3
top setosa
freq 50
1.3. 데이터 크기 조회
df.shape
>>>
(150, 5) #행, 열
1.4. 데이터 칼럼 조회
df.columns
>>>
Index(['sepal_length', 'sepal_width', 'petal_length', 'petal_width',
'species'],
dtype='object')
2.1. 상단부터 n건 조회
df.head()
>>>
sepal_length sepal_width petal_length petal_width species
0 5.1 3.5 1.4 0.2 setosa
1 4.9 3.0 1.4 0.2 setosa
2 4.7 3.2 1.3 0.2 setosa
3 4.6 3.1 1.5 0.2 setosa
4 5.0 3.6 1.4 0.2 setosa
2.2. 하단부터 n건 조회
df.tail()
sepal_length sepal_width petal_length petal_width species
145 6.7 3.0 5.2 2.3 virginica
146 6.3 2.5 5.0 1.9 virginica
147 6.5 3.0 5.2 2.0 virginica
148 6.2 3.4 5.4 2.3 virginica
149 5.9 3.0 5.1 1.8 virginica
3.1. 각 column별 최댓값/최솟값 Series 형태로 반환
df.max()
df.min()
3.2. 특정 column(sepal_length)이 갖는 최댓값/최솟값
df['sepal_length'].max()
df['sepal_length'].min()
4.1. index 기준 정렬(sort_index())
# 오름차순
df.sort_index()
df.sort_index(ascending=True)
# 내림차순
df.sort_index(ascending=False)
4.2. 특정 값 기준 정렬(sort_values(by=' '))
# 오름차순
df.sort_values(by='petal_width')
df.sort_values(by='petal_width', ascending=True)
# 내림차순
df.sort_values(by='petal_width', ascending=False)
5.1. 특정 column들에 해당하는 값만 조회
col = ['sepal_length', 'petal_length','species']
df[col].head()
>>>
sepal_length petal_length species
0 5.1 1.4 setosa
1 4.9 1.4 setosa
2 4.7 1.3 setosa
3 4.6 1.5 setosa
4 5.0 1.4 setosa
5.2. 특정 조건을 만족하는 값(1가지)만 조회
condition = df['species'] == 'virginica'
df[condition].head(3)
>>>
sepal_length sepal_width petal_length petal_width species
100 6.3 3.3 6.0 2.5 virginica
101 5.8 2.7 5.1 1.9 virginica
102 7.1 3.0 5.9 2.1 virginica
5.3. 특정 조건을 만족하는 값(2가지 이상) 조회
condition1 = df['species'] == 'virginica'
condition2 = df['sepal_width'] > 3
df[condition1 & condition2].head(3)
>>>
sepal_length sepal_width petal_length petal_width species
100 6.3 3.3 6.0 2.5 virginica
109 7.2 3.6 6.1 2.5 virginica
110 6.5 3.2 5.1 2.0 virginica
5.4. 특정 문자열을 포함하는 값들만 조회
한가지 문자열만 포함된 경우(ver)
contain_ver = df['species'].str.contains("ver")
df[contain_ver].head(3)
>>>
sepal_length sepal_width petal_length petal_width species
50 7.0 3.2 4.7 1.4 versicolor
51 6.4 3.2 4.5 1.5 versicolor
52 6.9 3.1 4.9 1.5 versicolor
두가지 문자열이 포함된 경우(ver|vir)
contain_ver_vir = df['species'].str.contains("ver|vir")
df[contain_ver_vir]
# 데이터프레임을 섞어줌(head 먹였을 떄, ver 또는 vir 하나만 보일까봐)
df_shuffled = df[contain_ver_vir].sample(frac=1).reset_index(drop=True)
df_shuffled.head()
>>>
sepal_length sepal_width petal_length petal_width species
0 5.8 2.7 5.1 1.9 virginica
1 5.6 2.9 3.6 1.3 versicolor
2 5.7 2.9 4.2 1.3 versicolor
3 6.2 2.2 4.5 1.5 versicolor
4 7.2 3.2 6.0 1.8 virginica
loc, iloc 활용
6.1. loc (location)
6.1.1) by label(s)
df.loc[row label 값, column label 값]
# row label이 인덱스 '0'인 값 조회, column label은 전체
df.loc[0, ]
>>>
sepal_length 5.1
sepal_width 3.5
petal_length 1.4
petal_width 0.2
species setosa
Name: 0, dtype: object
# row label이 인덱스 '0'인 값 중, column label이 'species'인 것만 조회
df.loc[0,'species']
>>>
'setosa'
# row label이 인덱스 '2~4'인 값 중, column label이 'sepal_length ~ petal_length'인 것만 조회
df.loc[2:4, 'sepal_length':'petal_length']
>>>
sepal_length sepal_width petal_length
2 4.7 3.2 1.3
3 4.6 3.1 1.5
4 5.0 3.6 1.4
6.1.2) by boolean array
# column label 'species'의 값이 'virginica'인 것(True)만 출력
df[df['species'] == 'virginica'].head(3)
sepal_length sepal_width petal_length petal_width species
100 6.3 3.3 6.0 2.5 virginica
101 5.8 2.7 5.1 1.9 virginica
102 7.1 3.0 5.9 2.1 virginica
# column label 'species'의 값이 'virginica'이고(and),
# column label 'sepal_length'의 값이 5.0 보다 작은 것(True)만 출력
df[(df['species'] == 'virginica') & (df['sepal_length'] < 5.0)].head(3)
sepal_length sepal_width petal_length petal_width species
106 4.9 2.5 4.5 1.7 virginica
6.2. iloc (integer location)
df.iloc[row index 값, column index 값]
# row index가 0번째인 값 조회, column index는 전체
df.iloc[0, ]
>>>
sepal_length 5.1
sepal_width 3.5
petal_length 1.4
petal_width 0.2
species setosa
Name: 0, dtype: object
# row index가 0번째인 값 중, column index가 4번째('species')인 것만 조회
df.iloc[0,4]
>>>
'setosa'
# row index가 '2~4(5-1)번째'인 값 중, column index가 '0~2(3-1)번째'인 값만 조회
df.iloc[2:5, 0:3]
>>>
sepal_length sepal_width petal_length
2 4.7 3.2 1.3
3 4.6 3.1 1.5
4 5.0 3.6 1.4
.at/iat
7.1. .at
df.at[row label 값, column label 값]
# row label이 인덱스 '0'인 값 중, column label이 'species'인 것만 조회
df.at[0,'species']
>>>
'setosa'
#at는 여러개 접근 불가
df.at[2:4, 'sepal_length':'petal_length']
>>>
TypeError: unhashable type: 'slice'
7.2. .iat
df.iat[row index 값, column index 값]
# row index가 0번째인 값 중, column index가 4번째('species')인 것만 조회
df.iat[0,4]
>>>
'setosa'
df.iat[2:5, 0:3]
>>>
ValueError: iAt based indexing can only have integer indexers
.isin()
data = {
'A': [' ', 'b', np.nan, 'd', 'e'],
'B': ['o', 6, 'g', 'o', 'i'],
'C': [7, 'o', np.nan, None, 'm'],
'D': ['n', None, 'o', 9, 'p'],
'E': [np.nan, 'r', 10, None, ''],
}
>>>
A B C D E
0 o 7 n NaN
1 b 6 o None r
2 NaN g NaN o 10
3 d o None 9 None
4 e i m p
8.1 위치 정보 찾기
search = 'o'
find_location = df.isin([search])
>>>
A B C D E
0 False True False False False
1 False False True False False
2 False False False True False
3 False True False False False
4 False False False False False
search = ['m','o']
find_location = df.isin(search) #여러개도 가능
8.2. 해당 값이 존재하는 column 찾기
#.all() 할 시, column 내 모든 셀에 'o'가 있어야 Ture 반환
fine_column = find_location.any()
#해당 되는 column들 list로 변환
col_list = fine_column[fine_column==True].index.to_list()
8.3. 확보한 column 정보를 바탕으로 row 정보 찾기
dic = {}
for col in col_list:
condition = find_location[col] == True
find_location[col][condition].index.to_list()
key = col
value = find_location[a][condition].index.to_list()
dic[key] = value
dic
>>>
{'B': [0, 3], 'C': [1], 'D': [2]}
8.4. column 정보와 row 정보 데이터화
results = []
for key, values in dic.items():
for value in values :
result = (key, value)
results.append(result)
results
>>>
[('B', 0), ('B', 3), ('C', 1), ('D', 2)]