본문 바로가기

취업준비/인공지능

[AI Tech] 1주차 1-Appendix2차시 Pandas

1-Appendix2. Pandas(Panel Data)

1. 정의

- 구조화된 데이터의 처리를 지원하는 Python 라이브러리

- 고성능 Array 계산 라이브러리인 Numpy와 통합하여, 강력한 "스프레드시트" 처리 기능을 제공

- 인덱싱, 연산용 함수, 전처리 함수 등을 제공함

 

2. 코드

# 라이브러리 호출
import pandas as pd

# DATA URL
data_url = 'https://archive.ics.uci.edu/m1/machine-learning-databases/housing/housing.data'
# CSV 타입 데이터
df_data = pd.read_csv(data_url, sep='\s+', header = None)

df_data.head() # 처음 다섯 줄 출력

# COLUMN 헤더 설정
df_data.columns = [
	'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
df_data.head()

df_data.values
type(df_data.values) #numpy 형식

 

3. Pandas의 구성

Series

DataFrame 중 하나의 Column에 해당하는 데이터의 모음 Object

 

DataFrame

Data Table 전체를 포함하는 Object

 

4. 일반적인 Pandas 활용

# DATA URL
data_url = 'https://archive.ics.uci.edu/m1/machine-learning-databases/housing/housing.data'
# CSV 타입 데이터
df_data = pd.read_csv(data_url, sep='\s+', header = None)

이 부분은 기존 데이터를 불러와서 DataFrame을 생성

 

5. Series

Column Vector를 표현하는 Object

list_data = [1,2,3,4,5]
example_obj = Series(data = list_data)
example_obj

list data 형태로도 데이터를 넣을 수 있지만, dict 형식으로도 넣을 수 있다.

Series를 출력하면 Index, data 그리고 Data Type이 함께 출력된다.

- numpy.ndarry의 subclass이다.

- data: 아무 타입이나 가능

- 인덱스 레이블은 정렬되어 있지 않아도 된다.

- Duplicates are possible (but result in reduced functionality)

list_data = [1,2,3,4,5]
list_name = ["a", "b", "c", "d", "e"]
example_obj = Series(data = list_data, index=list_name)
example_obj

index 또한 이름을 지정할 수 있다.

dict_data = {"a":1, "b":2, "c":3, "d":4, "e":5}
example_obj = Series(dict_data, dtype=np.float32, name="example_data")
example_obj

이런 식으로 dict를 사용하면 한 번에 data와 index를 지정하고 data type과 series 이름을 설정할 수 있다.

example_obj["a"]

Series에서는 data index로 접근하여 데이터를 출력한다.

 

 

6. Dataframe

기본적으로 2차원 행렬임을 가정하고 계산한다.

- NumPy array-like

- Each column can have a different type

- Row and Column index

- Size mutable: insert and delete columns

Series를 모아서 만든 Data Table이라고 생각해도 무방하다.

from pandas import Series, Dataframe
import pandas as pd
import numpy as np

raw_data = {'first_name': ['Jason', 'Molly', 'Tina', 'Jake', 'Amy'],
	'last_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze'],
    'age': [42, 52, 36, 24, 73],
    'city': ['San Francissco', 'Baltimore', 'Miami', 'Douglas', 'Boston']}
df = pd.DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city'])
df

이 코드처럼 dict형식의 데이터를 넣어도 무방하지만, series와 마찬가지로 dict 형식은 잘 사용하지 않는다.

DataFrame(raw_data, columns=['age', 'city'])

NumPy와 다르게 엑셀처럼 특정 column만 가져올 수 있다. (매우 중요)

df = DataFrame(raw_data, columns = ["first_name", "last_name", "age", "city", "debt"])
df.first_name

Column 선택 후 Series를 추출한다.

df["first_name"]

Column 선택 후 Series를 추출한 것으로 위의 코드와 같은 결과를 출력한다.

df.loc[1]

loc은 Index location을 의미한다.

df["age"].iloc[1:]

iloc은 Index Position을 의미한다.

loc과의 차이점은 index의 위치로 이동한다.

쉽게 말해, loc은 index의 이름으로, iloc은 index의 번호로 정렬한다.

s = pd.Series(np.nan, index=[49,48,47,46,45,1,2,3,4,5])
s
s.loc[:3] #Index가 3인 것까지
s.iloc[:3] #Position이 3인 것까지 출력

위의 코드는 대표적인 예시이다.

또한 Column에 새로운 데이터를 할당할 때는 다음과 같은 방법으로도 할 수 있다.

df.debt = df.age > 40
df

자동으로 True와 False를 구분하여 debt라는 새로운 Index의 값으로 저장한다. (굉장히 많이 쓰는 방법이다)

그 외에

Transpose

df.T

값 출력

df.values

csv 변환

df.to_csv()

등을 할 수 있다.

Column 삭제는

del df["debt"]

로 한다.

 

7. Selection

한 개의 column 선택 시

df["account"].head(3)

여러 개의 column 선택 시

df[["account", "street", "state"]].head(3)

반면에, index number를 기준으로 가져오면 row를 기준으로 가져오는데, pandas의 단점으로도 볼 수 있다.

df[:3]

column 이름과 함께 row index 사용 시, 해당 column만 가져오려면 다음과 같이 코드를 작성하면 된다.

df["account"][:3]

Series Selection

account_serires = df["account"]
account_serires[:3]

# 1개 이상의 index
account_series[[0,1,2]]

# Boolean Index
account_series[account_serires < 250000]

Index 변경

df.index = df["account"]
del df.account

Basic, loc, iloc selection

# Column과 Index Number
df[["name", "street"]][:2]

# Column과 Index Name
df.loc[[211829,, 320563],["name","street"]]

# Column Number와 Index Number
df.iloc[:2,:2]

loc으로 하는 경우는 별로 없다.

보통은 iloc으로 사용한다.

Index 재설정하는 것이 귀찮다면, range로 넣어도 된다.

df.index = list(range(0,15))
df.head()

 

8. Data Drop

df.drop(1)

이 방법은 Index Number로 drop 하는 방법이다.

다만, Pandas는 원본은 훼손하지 않기 때문에 원본을 바꾼고 싶다면 inplace를 넣어 해결한다.

df.drop("city", axis=1, inplace=True).head()

 

9. Series Operation

보통은 Index를 기준으로 연산을 수행하기 때문에 겹치는 index가 없을 경우 NaN값으로 반환한다.

s1 = Series(range(1,6), index=list("abced"))
s1

s2 = Series(range(5,11), index=list("bcedef"))
s2

# ADD -> 두 개 연산 모두 같은 결과를 출력
s1.add(s2)
s1 + s2

 

10. Dataframe Operation

df는 column과 index를 모두 고려한다.

add operation을 쓰면 NaN값을 0으로 변환한다.

Operation Types: add, sub, div, mul

df1 = DataFrame(np.arrange(9).reshape(3,3), columns=list("abc"))
df1

df2 = DataFrame(np.arange(16).reshape(4,4), columns=list("abcd"))
df2

df1 + df2 # 없는 값은 NaN으로 둔다.
df1.add(df2,fill_value=0) # NaN을 0으로 변환한다.

 

만약 Series와 Dataframe을 add 하면, broadcasting이 발생하며, 모든 column에 series가 더해지게 된다.

 

11. Lambda와 Map

- Pandas의 series type의 데이터에도 map함수를 적용할 수 있다.

- Function 대신 dict, sequence형 자료등으로 대체 가능하다.

s1 = Series(np.arange(10))
s1.head(5)
s1.map(lambda x: x**2).head(5)

dict와 map으로 데이터 변환을 손쉽게 할 수 있다.

df.sex.unique()
df["sex_code"] = df.sex.map({"male":0, "female":1})
df.head(5)

이를 구현하는 다른 방법으로는 replace가 있다.

# 방법1
df.sex.replace(
	{"male":0, "female":1}
).head()

# 방법2
df.sex.replace(
	["male", "female"],
    [0, 1], inplace=True)

 

12. Apply

Map과 달리, series 전체(column)에 해당 함수를 적용한다.

입력값이 series 데이터로 입력받아 handling 가능하다.

각 column 별로 결과값을 반환한다.

df_info = df[["earn", "height", "age"]]
df_info.head()

f = lambda x : x.max() - x.min()
df_info.apply(f)

 

13. Applymap for Dataframe

Series 단위가 아닌 element 단위로 함수를 적용한다.

Series 단위에 Apply를 적용시킬 때와 같은 효과를 가져온다.

f = lambda x : -x
df_info.applymap(f).head(5)

f = lambda x : -x
df_info["earn"].apply(f).head(5)

 

14. Pandas 내장함수

describe

Numeric type 데이터의 요약 정보를 보여준다.

df = pd.read_csv("wages.csv")
df.head()

df.describe()

unique

Series Data의 유일한 값을 list를 반환한다.

# 유일한 인종의 값 list
df.race.unique()

# Dict Type으로 Index
np.array(dict(enumerate(df["race"].unique())))

# Label Index 값과 Label 값 각각 추출
value = list(map(int, np.array(list(enumerate(df["race"].unique())))[:, 0].tolist()))
key = np.array(list(enumerate(df["race"].unique())), dtype=str)[:, 1].tolist()

value, key

 

 

 

 

 

© NAVER Connect Foundation. All Rights Reserved