(Machine) 11. Pandas # 1

6 분 소요

# 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']

댓글남기기