
Series) 클래스와 데이터 프레임(DataFrame) 클래스를 제공데이터 자체는 값(value)라고 함
시리즈 = 값(value) + 인덱스(index)
data = [9904312, 3448737, 2890451, 2466052]
index = ["서울", "부산", "인천", "대구"]
s = pd.Series(data, index=index)
s
서울 9904312
부산 3448737
인천 2890451
대구 2466052
dtype: int64
pd.Series(range(10, 14)), pd.Series(range(10, 14), index=range(4))
(0 10
1 11
2 12
3 13
dtype: int64,
0 10
1 11
2 12
3 13
dtype: int64)
index 속성으로 접근할 수 있음values 속성으로 접근할 수 있음s, s.index, s.values
(도시
서울 9904312
부산 3448737
인천 2890451
대구 2466052
Name: 인구, dtype: int64,
Index(['서울', '부산', '인천', '대구'], dtype='object', name='도시'),
array([9904312, 3448737, 2890451, 2466052]))
name 속성을 이용하여 시리즈 데이터에 이름을 붙일 수 있음index.name 속성으로 시리즈의 인덱스에도 이름을 붙일 수 있음s.name = '인구'
s.index.name = '도시'
s
도시
서울 9904312
부산 3448737
인천 2890451
대구 2466052
Name: 인구, dtype: int64
s / 1_000_000 # 인덱스에는 영향이 미치지 않고 값에만 영향이 미친다
도시
서울 9.904312
부산 3.448737
인천 2.890451
대구 2.466052
Name: 인구, dtype: float64
s[1], s["부산"], s[3], s[-1], s['대구']
(3448737, 3448737), (2466052, 2466052, 2466052)
s[['부산', '서울', '대구', '서울']]
도시
부산 3448737
서울 9904312
대구 2466052
서울 9904312
Name: 인구, dtype: int64
# 인구가 250만 초과, 500만 미만인 경우
s[(250e4 < s) & (500e4 > s) ]
도시
부산 3448737
인천 2890451
Name: 인구, dtype: int64
s[1:3] # 두번째(1)부터 세번째(2)까지
도시
부산 3448737
인천 2890451
Name: 인구, dtype: int64
s0 = pd.Series(np.arange(3), index=list('abc'))
s0['a'], s0.a
시리즈 객체는 라벨 값에 의해 인덱싱이 가능하므로 실질적으로 인덱스 라벨 값을 키(key)로 가지는 딕셔너리 자료형과 유사
따라서 딕셔너리 자료형에서 제공하는 in 연산도 가능하고 items 메서드를 사용하면 for 루프를 통해 각 원소의 키(key)와 값(value)을 접근할 수도 있음
"서울" in s, "서울" in s.index # 시리즈 s 안에 '서울'이라는 인덱스 라벨(키)가 있는지 여부
(True, True)
# for i in s.items()
for k,v in s.items():
# print(i)
print(f"{k} = {v}")
서울 = 9904312
부산 = 3448737
인천 = 2890451
대구 = 2466052
s2 = pd.Series({
"서울": 9631482,
"부산": 3393191,
"인천": 2632035,
"대전": 1490158
})
s2
서울 9631482
부산 3393191
인천 2632035
대전 1490158
dtype: int64
s2 = pd.Series({
"서울": 9631482,
"부산": 3393191,
"인천": 2632035,
"대전": 1490158
}, index=["부산", "서울", "인천", "대전"])
s2
부산 3393191
서울 9631482
인천 2632035
대전 1490158
dtype: int64
ds = s - s2
대구 NaN
대전 NaN
부산 55546.0
서울 272830.0
인천 258416.0
dtype: float64
s.values - s2.values # 강제로 위치로 계산한 것이기 때문에 정확한 것이 아니다.
array([272830, 55546, 258416, 975894])
# NaN인 값을 구하고 싶다면 null 메소드를 사용
ds.isnull(), ds.notnull()
(대구 True
대전 True
부산 False
서울 False
인천 False
dtype: bool,
대구 False
대전 False
부산 True
서울 True
인천 True
dtype: bool)`
ds[ds.isnull()], ds[ds.notnull()]
(대구 NaN
대전 NaN
dtype: float64,
부산 55546.0
서울 272830.0
인천 258416.0
dtype: float64)
# 인구 증가율 구하기 (%)
rs = (s -s2) / s2 * 100
# rs = rs[rs.notnull()]
rs = rs.dropna()
rs
부산 1.636984
서울 2.832690
인천 9.818107
dtype: float64
rs['부산'] = 1.63
rs
부산 1.630000
서울 2.832690
인천 9.818107
dtype: float64
columns 인수로, 행방향 인덱스는 index 인수로 지정import pandas as pd
data = {
"2015": [9904312, 3448737, 2890451, 2466052],
"2010": [9631482, 3393191, 2632035, 2431774],
"2005": [9762546, 3512547, 2517680, 2456016],
"2000": [9853972, 3655437, 2466338, 2473990],
"지역": ["수도권", "경상권", "수도권", "경상권"],
"2010-2015 증가율": [0.0283, 0.0163, 0.0982, 0.0141]
}
columns = ["지역", "2015", "2010", "2005", "2000", "2010-2015 증가율"]
index = ["서울", "부산", "인천", "대구"]
df = pd.DataFrame(data, columns=columns, index=index)
df
지역 2015 2010 2005 2000 2010-2015 증가율
서울 수도권 9904312 9631482 9762546 9853972 0.0283
부산 경상권 3448737 3393191 3512547 3655437 0.0163
인천 수도권 2890451 2632035 2517680 2466338 0.0982
대구 경상권 2466052 2431774 2456016 2473990 0.0141
values 속성 사용columns 속성index 속성df.values
array([['수도권', 9904312, 9631482, 9762546, 9853972, 0.0283],
['경상권', 3448737, 3393191, 3512547, 3655437, 0.0163],
['수도권', 2890451, 2632035, 2517680, 2466338, 0.0982],
['경상권', 2466052, 2431774, 2456016, 2473990, 0.0141]], dtype=object)
df.columns
Index(['지역', '2015', '2010', '2005', '2000', '2010-2015 증가율'], dtype='object')
df.index
df.index
Index(['서울', '부산', '인천', '대구'], dtype='object')
# 시리즈처럼 열방향 인덱스와 행방향 인덱스에 이름을 붙이는 것도 가능
df.index.name = '도시'
df.columns.name = '특성'
df
특성 지역 2015 2010 2005 2000 2010-2015 증가율
도시
서울 수도권 9904312 9631482 9762546 9853972 0.0283
부산 경상권 3448737 3393191 3512547 3655437 0.0163
인천 수도권 2890451 2632035 2517680 2466338 0.0982
대구 경상권 2466052 2431774 2456016 2473990 0.0141
df['지역'], type[df['지역']]
(도시
서울 수도권
부산 경상권
인천 수도권
대구 경상권
Name: 지역, dtype: object,
type[도시
서울 수도권
부산 경상권
인천 수도권
대구 경상권
Name: 지역, dtype: object])
df['2010-2015 증가율'] = df['2010-2015 증가율'] * 100
df.head()
특성 지역 2015 2010 2005 2000 2010-2015 증가율
도시
서울 수도권 9904312 9631482 9762546 9853972 2.83
부산 경상권 3448737 3393191 3512547 3655437 1.63
인천 수도권 2890451 2632035 2517680 2466338 9.82
대구 경상권 2466052 2431774 2456016 2473990 1.41
# 하나의 열만 인덱싱하면 시리즈가 반환
df['지역']
도시
서울 수도권
부산 경상권
인천 수도권
대구 경상권
Name: 지역, dtype: object
# 여러개의 열을 인덱싱하면 부분적인 데이터프레임이 반환
df[['2010', '2015']]
특성 2010 2015
도시
서울 9631482 9904312
부산 3393191 3448737
인천 2632035 2890451
대구 2431774 2466052
특성 2010
도시
서울 9631482
부산 3393191
인천 2632035
대구 2431774
type(df['2010'])
pandas.core.series.Series
df2 = pd.DataFrame(np.arange(12).reshape(3, -1))
df2
0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
df2[1]
0 1
1 5
2 9
Name: 1, dtype: int64
df2[[1, 2]]
1 2
0 1 2
1 5 6
2 9 10
### 행 인덱싱
* 만약 행 단위로 인덱싱을 하고자 하면 항상 슬라이싱(slicing)을 해야함
* 인덱스의 값이 문자 라벨이면 라벨 슬라이싱도 가능
df
특성 지역 2015 2010 2005 2000 2010-2015 증가율
도시
서울 수도권 9904312 9631482 9762546 9853972 2.83
부산 경상권 3448737 3393191 3512547 3655437 1.63
인천 수도권 2890451 2632035 2517680 2466338 9.82
대구 경상권 2466052 2431774 2456016 2473990 1.41
df[0:1], df[:1]
(특성 지역 2015 2010 2005 2000 2010-2015 증가율
도시
서울 수도권 9904312 9631482 9762546 9853972 2.83,
특성 지역 2015 2010 2005 2000 2010-2015 증가율
도시
서울 수도권 9904312 9631482 9762546 9853972 2.83)
| 인덱싱 값 | 가능 | 결과 | 자료형 | 추가사항 |
|---|---|---|---|---|
| 라벨 | O | 열 | 시리즈 | |
| 라벨 리스트 | O | 열 | 데이터프레임 | |
| 인덱스 데이터 (정수) | X | 열 라벨이 정수인 경우에는 라벨 인덱싱으로 인정 | ||
| 인덱스 데이터(정수) 슬라이스 | O | 행 | 데이터프레임 |
# comma seperated values : comma(,)로 구분된 값들
# 샘플 데이터 만들기
%%writefile sample1.csv
c1,c2,c3
1,1.11,one
2,2.22,two
3,3.33,three
Writing sample1.csv
# pd.read_csv(파일이름) : CSV파일로부터 데이터를 읽어 데이터프레임 만들기
pd.read_csv('sample1.csv')
c1 c2 c3
0 1 1.11 one
1 2 2.22 two
2 3 3.33 three
# 만약 데이터 파일에 열 인덱스 정보가 없는 경우에는 read_csv 명령의 names 인수로 설정 가능
%%writefile sample2.csv
1, 1.11, one
2, 2.22, two
3, 3.33, three
Writing sample2.csv
pd.read_csv('sample2.csv')
1 1.11 one
0 2 2.22 two
1 3 3.33 three
pd.read_csv('sample2.csv', names=['c1', 'c2', 'c3']) # names=[열 이름 리스트]
c1 c2 c3
0 1 1.11 one
1 2 2.22 two
2 3 3.33 three
# 만약 테이블 내의 특정한 열을 행 인덱스로 지정하고 싶으면 index_col 인수를 사용
pd.read_csv('sample2.csv', names=['c1', 'c2', 'c3'], index_col=2) # index_col=n번째를 지정(0부터 ->index)
c1 c2
c3
one 1 1.11
two 2 2.22
three 3 3.33
df = pd.read_csv('sample1.csv')
df
c1 c2 c3
0 1 1.11 one
1 2 2.22 two
2 3 3.33 three
df['c4'] = df['c1'] + df['c2']
df
c1 c2 c3 c4
0 1 1.11 one 2.11
1 2 2.22 two 4.22
2 3 3.33 three 6.33
url = 'https://raw.githubusercontent.com/qus0in/230621_pandas/main/titanic.csv'
titanic_df = pd.read_csv(url)
titanic_df
head 메서드나 tail 메서드를 이용titanic_df.head()
titanic_df.tail()