(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']
댓글남기기