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
'취업준비 > 인공지능' 카테고리의 다른 글
[AI Tech] 1주차 3-2차시 데이터 전처리 (2) (0) | 2024.01.20 |
---|---|
[AI Tech] 1주차 3-1차시 데이터 전처리 (1) (1) | 2024.01.20 |
[AI Tech] 1주차 1-Appendix1차시 Numpy (0) | 2024.01.20 |
[AI Tech] 1주차 2-4차시 Quiz 1 (0) | 2024.01.20 |
[AI Tech] 1주차 2-3차시 탐색적 자료 분석 연습 (0) | 2024.01.20 |