(Machine) 11. Pandas # 1
# Pandas란
- 구조화된 데이터의 처리를 지원하는 Python 라이브러리
- Python계의 엑셀
- 고성능 Array 계산 라이브러리인 Numpy와 통합하여 강력한 스프레드시트 처리 기능을 제공
- 인덱싱, 연산용 함수, 전처리 함수 등을 제공함
# Pandas의 구성
1. DataFrame
- Data Table 전체를 포함하는 Object
- Series를 모아서 만든 Data Table = 기본 2차원 matrix깂
- Column과 index를 이용해 값의 접근이 가능하다.
raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
print(df)
#====== 출력값 ========
# first_name last_name age city
# 0 Jason Miller 42 San Francisco
# 1 Molly Jacobson 52 Baltimore
# 2 Tina Ali 36 Miami
# 3 Jake Milner 24 Douglas
# 4 Amy Cooze 73 Boston
# 값 접근 방법 2가지
df['first_name']
df.first_name
#====== 출력값 =======
# 0 Jason
# 1 Molly
# 2 Tina
# 3 Jake
# 4 Amy
- 값 접근 방법
#====== 출력값 ========
2. Series
- DataFrame 중 하나의 column에 해당하는 데이터의 모음
- Colum Vector를 표현하는 object
- 앞 colum은 인덱스 값을 표현, 뒤 colum은 value값을 표현
list_data = [1,2,3,4,5]
example_obj = Series(data = list_data)
print(example_obj)
#====== 출력값 ========
# 0 1
# 1 2
# 2 3
# 3 4
# 4 5
- data index에 접근하기
list_data = [1,2,3,4,5]
example_obj = Series(data = list_data)
print(example_obj[0])
#====== 출력값 ========
# 1
# Pandas의 기능
1. pd.read_csv
- csv 형테의 데이터를 읽어와 엑셀형식으로 만들어준다.
data_url = './housing.data' #Data Root
#csv 타입 데이터 로드, separate는 빈공간으로 지정하고, Column은 없음
df_data = pd.read_csv(data_url, sep='\s+', header = None)
# valuese를 사용하면 matrix 데이터로 바꿔줄수 있다.
print(type(df_data.values))
2. loc && iloc
- loc
- 인덱스의 값을 의미
- index의 값에 해당하는 dataFrame들을 가져온다.
- iloc (많이씀)
- 인덱스의 자체를 의미
- index의 dataFrame들을 가져온다.
raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
print(df.loc[:2])
print('#########')
print(df.iloc[:2])
#=======출력결과=======
# ######### loc
# first_name last_name age city
# 0 Jason Miller 42 San Francisco
# 1 Molly Jacobson 52 Baltimore
# 2 Tina Ali 36 Miami
# ######### iloc
# first_name last_name age city
# 0 Jason Miller 42 San Francisco
# 1 Molly Jacobson 52 Baltimore
3. DataFrame 새로운 데이터 할당/삭제 (*)
raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
print(df.age >40)
df['debt'] = df.age >40
print(df)
#=======출력결과=======
# first_name last_name age city debt
# 0 Jason Miller 42 San Francisco True
# 1 Molly Jacobson 52 Baltimore True
# 2 Tina Ali 36 Miami False
# 3 Jake Milner 24 Douglas False
# 4 Amy Cooze 73 Boston True
del df['debt']
print(df)
#=======출력결과=======
# 0 Jason Miller 42 San Francisco
# 1 Molly Jacobson 52 Baltimore
# 2 Tina Ali 36 Miami
# 3 Jake Milner 24 Douglas
# 4 Amy Cooze 73 Boston
4. selection && drop
1) head
raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
# Series 객체
df["first_name"].head(3)
#=======출력결과=======
# 0 Jason
# 1 Molly
# 2 Tina
# DataFrame 객체
df[ ["first_name","last_name"] ].head(3)
#=======출력결과=======
# first_name last_name
# 0 Jason Miller
# 1 Molly Jacobson
# 2 Tina Ali
2) indexNumber
- column 이름 없이 사용하는 index number는 row를 의미 한다.
- column이름과 함께 row index 사용시, 해당 colum만 가져온다.
#기본 DataFrame
raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
'age': [42, 52, 36, 24, 73],
'city': ['San Francisco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
# df에 담긴 데이터 프레임
# first_name last_name age city
# 0 Jason Miller 42 San Francisco
# 1 Molly Jacobson 52 Baltimore
# 2 Tina Ali 36 Miami
# 3 Jake Milner 24 Douglas
# 4 Amy Cooze 73 Boston
df[:3]
#=======출력결과=======
# 0 Jason Miller 42 San Francisco
# 1 Molly Jacobson 52 Baltimore
# 2 Tina Ali 36 Miami
df['first_name'][:3]
#=======출력결과=======
# 0 Jason
# 1 Molly
# 2 Tina
- index는 기본 값이 seq 숫자 데이터이다.
- index를 id등 고유한 값으로 변경할 때는 아래와 같이 사용한다.
df.index = df["first_name"]
#=======출력결과=======
# first_name last_name age city
# first_name
# Jason Jason Miller 42 San Francisco
# Molly Molly Jacobson 52 Baltimore
# Tina Tina Ali 36 Miami
# Jake Jake Milner 24 Douglas
# Amy Amy Cooze 73 Boston
- index 재설정
df.index = list(range(0,5))
#=======출력결과=======
# last_name age city
# 0 Miller 42 San Francisco
# 1 Jacobson 52 Baltimore
# 2 Ali 36 Miami
# 3 Milner 24 Douglas
# 4 Cooze 73 Boston
3) del / Drop
- series 삭제
del df["first_name"]
#=======출력결과=======
# last_name age city
# first_name
# Jason Miller 42 San Francisco
# Molly Jacobson 52 Baltimore
# Tina Ali 36 Miami
# Jake Milner 24 Douglas
# Amy Cooze 73 Boston
- Row를 지우고 싶을 때 drop 사용
- dumy 데이터나 잘못된 데이터를 삭제하고 싶을떄 사용
# inplace 는 원본데이터를 수정하게 설정하는 것
df.drop(2, inplace=True)
#=======출력결과=======
# last_name age city
# 0 Miller 42 San Francisco
# 1 Jacobson 52 Baltimore
# 3 Milner 24 Douglas
# 4 Cooze 73 Boston
5. Series operation
- index 기준으로 연산 수행, 겹치는 index가 없는 경우 NaN으로 반환
#기본 Series Data
s1 = Series(range(1,6), index=list("abced"))
s2 = Series(range(5,11), index=list("bcedef"))
# 방법1
s1.add(s2)
# 방법2
s1 + s2
#=====출력값=====
# a NaN
# b 7.0
# c 9.0
# d 13.0
# e 11.0
# e 13.0
# f NaN
#### Nan 값을 0으로 치환
s1.add(s2, fill_value=0)
#=====출력값=====
# a 1.0
# b 7.0
# c 9.0
# d 13.0
# e 11.0
# e 13.0
# f 10.0
6. Lamda, Map, Replace 활용
1) labda 사용해서 값을 변경
s1 = Series(range(1,6))
result = s1.map(lambda x: x**2).head(5)
#=====출력값=====
0 1
1 4
2 9
3 16
4 25
2) map을 사용해서 값을 변경
s1 = Series(range(9))
z = {1: 'A', 2: 'B', 3: 'C'}
result = s1.map(z)
#=====출력값=====
0 NaN
1 A
2 B
3 C
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
3) Replace를 사용해서 값을 변경
# 출력
df.sex.replace(
{"male":0, "female":1}
).head()
# 실제 데이터로 적용
df.sex.replace(
["male", "female"],
[0,1], inplace=True)
6. describe
- numeric type 데이터의 요약 정보를 보여줌
- count, sum, std 등의 정를 한번에 보여준다!
data_file = './wages.csv' #Data file
df = pd.read_csv(data_file)
print(df.head())
print(df.describe())
#=====출력값=====
earn height ed age
count 1379.000000 1379.000000 1379.000000 1379.000000
mean 32446.292622 66.592640 13.354605 45.328499
std 31257.070006 3.818108 2.438741 15.789715
min -98.580489 57.340000 3.000000 22.000000
25% 10538.790721 63.720000 12.000000 33.000000
50% 26877.870178 66.050000 13.000000 42.000000
75% 44506.215336 69.315000 15.000000 55.000000
max 317949.127955 77.210000 18.000000 95.000000
7. unique
- series data의 유일한 값들을 뽑아준다.
- 카테고리 유형을 뽑아낼때 유용하다.
data_file = './wages.csv' #Data URL
df = pd.read_csv(data_file)
#### 1.unique list 뽑기
unique_list = df.race.unique()
# =====출력값=====
# ['white' 'other' 'hispanic' 'black']
#### 2. dict 형식으로 가공하기
unique_dic = np.array( dict( enumerate( unique_list ) ) )
# =====출력값=====
# {0: 'white', 1: 'other', 2: 'hispanic', 3: 'black'}
#### 3. list을 사용해 index, value 분리
unique_matrix = np.array( list( enumerate( unique_list ) ) )
key = unique_matrix[:, 0].tolist()
value = unique_matrix[:,1].tolist()
print(key, value)
# =====출력값=====
# ['0', '1', '2', '3'] ['white', 'other', 'hispanic', 'black']
댓글남기기