Index
1. Pandas란?
1_ Pandas 의 두가지 데이터 타입
2_ Pandas 데이터 타입의 차이점
2. Series
1_ Series 사용법
2_ Series의 index설정
3_ Series의 broadcasting(broadcasting)
4_ Series의 Offset index
5_ Series의 연산
3. DataFrame
1_ dictionary 안의 list로 DataFrame만들기
2_ list 안의 dictionary로 DataFrame만들기
3_ DataFrame의 index 설정
4_ DataFrame 에서 데이터 선택하기 _ row/colum/ (row, column)
5_ DataFrame 의 수정과 데이터 추가
6_ 컬럼 데이터 수정
4. Apply 함수
1_ Apply란?
2_ Apply 활용
Pandas 기초 1 - Series, DataFrame, apply
1. Pandas란?
데이터 분석을 위해, 만들어진 오픈소스 python 라이브러리입니다.
데이터 분석을 위해 R을 사용하시는 분들도 계시지만, 분석 이외에도 다양한
활용을 위해 python의 pandas를 활용한 분석을 추천드립니다.
1_ Pandas의 두가지 데이터 타입
pandas는 두가지 데이터 타입을 사용합니다.
- Series : index(행의 넘버링)와 values(값)을 가집니다.
- DataFrame : index와 values 그리고 columns를 가집니다.
2_ Pandas의 데이터 타입의 차이점
- columns의 유무 (Dataframe만 columns를 가짐)
- Series는 value들의 데이터 타입이 동일해야하지만
DataFrame 은 columns 덕분에 각각의 컬럼마다 데이터 타입이 다르게 지정 가능합니다.
2. Series
- 동일한 데이터 타입의 값을 갖습니다.
- value 만 설정하면 index는 0부터 자동으로 설정 됩니다.
1_ Series 사용법
pd.series() 를 사용해서 만들 수 있습니다.
[코드예제]
import numpy as np
import pandas as pd
data = pd.Series(np.random.randint(10, size=5))
data
[결과]
0 5
1 5
2 3
3 0
4 3
dtype: int64
2_ Series의 index설정
시리즈의 index 설정하는 방법은 index=list() 파라미터를 사용하여서 설정할 수 있습니다
[코드예제]
# index 설정
data = pd.Series(np.random.randint(10, size=5),
index=list("ABCDE"))
data
[결과]
A 3
B 7
C 3
D 3
E 6
dtype: int64
data의 인덱스와 값을 확인해보겠습니다.
[코드예제]
data.index, data.values
[결과]
(Index(['A', 'B', 'C', 'D', 'E'], dtype='object'), array([3, 7, 3, 3, 6]))
인덱스를 통해 값을 확인하는 방법은 두가지가 있습니다
- data["B"]
- data.B → 이 경우에는 인덱스가 "숫자"가 아닐 경우에 간편하게 사용할 수 있는 방법
[코드예제]
data["B"], data.B
[결과]
(7, 7)
데이터를 수정하는 방법은 인덱스로 바꾸고 싶은 값을 지정하여 변경하면 됩니다.
[코드예제]
data["C"] = 10
data
[결과]
A 3
B 7
C 10
D 3
E 6
dtype: int64
3_ Series의 브로드캐스팅 (broadcasting)
하나의 배열or 요소가 어떤 특정 배열에 영향을 미칠때 배열간의 형상을 맞추는 것을 브로드 캐스팅이라고 합니다
NumPy의 브로드 캐스팅처럼, series역시 브로드 캐스팅이 가능합니다.
데이터 * 10을 하면 각 값들에 *10이 되어서 나타나는 것을 확인할 수 있습니다.
[코드예제]
data * 10
[결과]
A 30
B 70
C 100
D 30
E 60
dtype: int64
4_ Series의 Offset index
오프셋 인덱스를 통해서 데이터를 선택하는 것도 가능합니다
3번째 데이터에서 끝까지, 2칸씩 점프하는 데이터를 선택해보겠습니다.
[코드예제]
data[2::2]
[결과]
C 10
E 6
dtype: int64
처음부터 끝까지, 역순으로 데이터를 정렬해보겠습니다.
[코드예제]
data[::-1]
[결과]
E 6
D 3
C 10
B 7
A 3
dtype: int64
5_ Series의 연산
시리즈의 연산에 대해서 배워보겠습니다.
[코드예제]
data
[결과]
A 3
B 7
C 10
D 3
E 6
dtype: int64
딕셔너리(dictionary)를 통해 data2를 만들어보겠습니다.
[코드예제]
data2 = pd.Series({"D":3, "E":5, "F":7})
data2
[결과]
D 3
E 5
F 7
dtype: int64
data와 data2를 더하면 같은 index끼리 자동으로 저해지는 것을 확인할 수 있습니다.
NaN이라고 적힌 A,B,C,F 값들은 data2에 데이터가 없기 때문에 더하지 않는 것입니다.
[코드예제]
result = data + data2
result # None
[결과]
A NaN
B NaN
C NaN
D 6.0
E 11.0
F NaN
dtype: float64
이런 현상을 방지하기 위해 마스킹을 이용해 data 시리즈의 값들을 그대로 넣어주겠습니다.
먼저 result.isnull() 을 사용해서 데이터에서 NaN 값들만 먼저 확인합니다.
boolen값으로 True & False 값으로 출력됩니다.
[코드예제]
result.isnull()
[결과]
A True
B True
C True
D False
E False
F True
dtype: bool
true로 마스킹 된 값에 data 시리즈의 값을 지정해주면
같은 인덱스 값들로 채워줍니다.
[코드예제]
result[result.isnull()] = data
result
[결과]
A 3.0
B 7.0
C 10.0
D 6.0
E 11.0
F NaN
dtype: float64
마찬가지로, F 값이 비어진 것은
시리즈 data2를 이용해서 넣어주겠습니다
[코드예제]
result[result.isnull()] = data2
result
[결과]
A 3.0
B 7.0
C 10.0
D 6.0
E 11.0
F 7.0
dtype: float64
3. DataFrame
- 데이터 프레임은 여러개의 Series로 구성되어있습니다.
- 같은 컬럼에 있는 value값은 같은 데이터 타입을 갖지만, columns 마다 다른 값을 가질 수 있습니다.
- 데이터 프레임을 만드는 방법은 두가지 입니다.
- Dictinary 안의 List
- List안의 Dictionary
1_ dictionary 안의 list로 DataFrame만들기
{ } 딕셔너리 안에 [ ] 리스트로 데이터 프레임을 만들어보겠습니다.
여기서 딕셔너리 안의 key 값이 column이 된다는 것을 확인 할 수 있습니다.
[코드예제]
datas = {
"name":["joy", "collection"],
"email":["joy@gmail.com", "collection@naver.com"],
}
print(datas)
[결과]
{'name': ['joy', 'collection'], 'email': ['joy@gmail.com', 'collection@naver.com']}
[코드예제]
df = pd.DataFrame(datas)
df
[결과]
2_ list 안의 dictionary로 DataFrame만들기
[ ] 리스트 안에 { } 딕셔너리를 통해 데이터 프레임을 만들어보겠습니다.
여기서도 마찬가지로 key값이 column이 되는 것을 확인할 수 있습니다.
[코드예제]
datas = [
{"name":"joy", "email":"joy@gmail.com"},
{"name":"collecetion", "email":"collection@naver.com"},
]
datas
[결과]
[{'name': 'joy', 'email': 'joy@gmail.com'},
{'name': 'collecetion', 'email': 'collection@naver.com'}]
column의 순서는 자동으로 알파벳 순서로 들어가게 됩니다.
[코드예제]
df = pd.DataFrame(datas)
df
[결과]
3_ DataFrame의 index 설정
위에서 두가지 방법으로 데이터 프레임을 만들었지만, 인덱스가 설정되지 않았다는 것을
확인 할 수 있습니다. 파라미터에서 index = [] 을 사용해 인덱스를 설정해줍니다.
[코드예제]
df = pd.DataFrame(datas, index=["one", "two"])
df
[결과]
- 인덱스만 확인하는 방법은 df.index를 통해서 설정할 수 있습니다.
[코드예제]
df.index
[결과]
Index(['one', 'two'], dtype='object')
- column만 확인하는 방법은 df. column을 통해 확인할 수 있습니다.
[코드예제]
df.columns
[결과]
Index(['email', 'name'], dtype='object')
- values (값) 을 확인하는 방법은 df.values를 통해 확인할 수 있습니다.
[코드예제]
df.values
[결과]
array([['joy', 'joy@gmail.com'],
['collecetion', 'collection@naver.com']], dtype=object)
4_ DataFrame 에서 데이터 선택하기 _ row/column/ (row, column)
이제 데이터 프레임에서, 행row, 열column, 행렬(row, column) 을 확인하는 방법을 배워보겠습니다
- 행(row) 선택 : loc
- 사용법 : df.loc[index]
[코드예제]
df = pd.DataFrame(datas)
df
[결과]
여기 데이터 프레임에서 .loc[1] 선택하면 두번째 행이 선택되고, 그 상태에서
column값 [email]을 입력하면 값(value)를 확인할 수 있습니다.
[코드예제]
df.loc[1]["email"]
[결과]
'collection@naver.com'
만약에 기존 데이터에서 index가 있으면 데이터가 수정되고,
index가 없으면 데이터가 추가됩니다.
기존에 없던 3번째 행 .loc[2]에 딕셔너리로 새로운 데이터를 입력해주니,
데이터 프레임의 3번째 행이 생기는 것을 확인할 수 있습니다.
[코드예제]
df.loc[2] = {"name":"blog", "email":"blog@daum.net"}
df
[결과]
- 열(column) 선택 : df[column]
- 사용법 : df[column]
[코드예제]
df
[결과]
name 컬럼을 확인하려면 df["name"]을 입력하여 값을 확인 할 수 있습니다.
[코드예제]
df["name"]
[결과]
row 와 마찬가지로 없는 column 에 값을 입력하면 새로운 열이 형성되는 것을 확인할 수 있습니다.
[코드예제]
df["id"] = ""
df
[결과]
비어있는 값에 range를 활용하여 값을 넣어보겠습니다.
[코드예제]
df["id"] = range(1, 4) # np.arange(1, 4)
df
[결과]
[코드예제]
df.dtypes
[결과]
name object
email object
id int32
dtype: object
- 행열(row, column)을 동시에 선택하겠습니다.
- 리스트를 통해 만들 수 있습니다.
1번째와 3번째 행의 email, id 컬럼을 선택하겠습니다.
[코드예제]
df.loc[[0, 2], ["email", "id"]]
[결과]
기존에는 알파벳 순서로 자동 입력되던 컬럼의 순서를 바꿀 수 있습니다.
df[[ , , ]] 리스트로 정렬되기 원하는 순서대로 column을 입력합니다.
[코드예제]
df[["id", "name", "email"]]
[결과]
head는 앞부분을, tail은 맨 뒷부분의 데이터를 조회할 수 있습니다.
[코드예제]
df.head(2)
[결과]
[코드예제]
df.tail(2)
[결과]
3. apply 함수
- 순서가 있는 데이터 집합에서 모든 값에 함수를 적용시키는 map 함수와 비슷합니다
email 컬럼에서 메일의 도메인만 가져와서 새로운 domain 컬럼을 생성해보겠습니다.
[코드예제]
df
[결과]
[코드예제]
def domain(email):
return email.split("@")[1].split(".")[0]
domain(df.loc[0]["email"])
[결과]
'gmail'
[코드예제]
df["domain"] = df["email"].apply(domain)
df
[결과]
[코드예제]
df["domain"] = df["email"].apply(lambda email: email.split("@")[1].split(".")[0])
df
[결과]
'IT develop > CODING' 카테고리의 다른 글
Pandas 기초 2 - append, concat, group by (0) | 2021.03.08 |
---|---|
NumPy 기초 3 - 행렬 데이터의 결합, concatenate 함수 (0) | 2021.03.08 |
NumPy 기초 2 - linspace, logspace 함수, NumPy random (0) | 2021.03.07 |
NumPy 기초 1 - numpy란, 행렬, 데이터선택, 브로드캐스팅(broad casting), 마스킹(masking) (0) | 2021.03.07 |
[Jupyter Notebook] space 번거로움을 자동적으로 바꾸어주는 auto pep8 설치 (0) | 2021.03.07 |