오경석의 개발노트

Python_DataFrame 본문

프로그래밍 언어/Python

Python_DataFrame

OHSAYU 2022. 9. 6. 15:34

DataFrame 생성

데이터프레임을 만드는 방법은 다양하다. 가장 간단한 방법은 다음과 같다.

  1. 우선 하나의 열이 되는 데이터를 리스트나 일차원 배열을 준비한다.
  2. 이 각각의 열에 대한 이름(라벨)을 키로 가지는 딕셔너리를 만든다.
  3. 이 데이터를 DataFrame 클래스 생성자에 넣는다. 동시에 열 방향 인덱스는 columns 인수로, 행 방향 인덱스는 index 인수로 지정한다.
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, index=index, columns=columns)
df

    앞에서 데이터프레임은 2차원 배열 데이터를 기반으로 한다고 했지만 사실은 공통 인덱스를 가지는 열 시리즈(column series)를 딕셔너리로 묶어놓은 것이라고 보는 것이 더 정확하다. 2차원 배열 데이터는 모든 원소가 같은 자료형을 가져야 하지만 데이터프레임은 각 열(column)마다 자료형이 다를 수 있기 때문이다.

    위 예제에서도 지역과 인구와 증가율은 각각 문자열, 정수, 부동소수점 실수이다. 시리즈와 마찬가지로 데이터만 접근하려면 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
>>> Index(['서울', '부산', '인천', '대구'], dtype='object')

시리즈에서처럼 열방향 인덱스와 행 방향 인덱스에 이름을 붙이는 것도 가능하다.

df.index.name = '도시'
df.columns.name = '연도'
df

데이터프레임은 전치(transpose)를 포함하여 넘파이 2차원 배열이 가지는 대부분의 속성이나 메서드를 지원한다.

df.T

열 데이터의 갱신, 추가, 삭제

데이터프레임은 열 시리즈의 딕셔너리로 볼 수 있으므로 열 단위로 데이터를 갱신하거나 추가, 삭제할 수 있다.

df['2010-2015 증가율'] = df['2010-2015 증가율'] * 100
df

# '2005-2010 증가율'이라는 이름의 열 추가
df['2005-2010 증가율'] = ((df['2010'] - df['2005']) / df['2005'] * 100).round(2)
df

# '2010-2015 증가율'이라는 이름의 열 삭제
del df["2010-2015 증가율"]
df

열 인덱싱

    데이터프레임은 열 라벨의 키로, 열 시리즈를 값으로 가지는 딕셔너리와 비슷하다고 하였다. 따라서 데이터프레임을 인덱싱을 할 때도 열 라벨(column label)을 키값으로 생각하여 인덱싱을 할 수 있다. 인덱스로 라벨 값을 하나만 넣으면 시리즈 객체가 반환되고 라벨의 배열 또는 리스트를 넣으면 부분적인 데이터프레임이 반환된다.

# 하나의 열만 인덱싱하면 시리즈가 반환된다.
df['지역']

# 여러개의 열을 인덱싱하면 부분적인 데이터프레임이 반환된다.
df[['2010', '2015']]

만약 하나의 열만 빼내면서 데이터프레임 자료형을 유지하고 싶다면 원소가 하나인 리스트를 써서 인덱싱 하면 된다.

# 2010이라는 열을 반환하면서 데이터프레임 자료형을 유지
df[['2010']]

type(df[['2010']])
>>> pandas.core.frame.DataFrame
# 2010이라는 열을 반환하면서 시리즈 자료형으로 변환
df['2010']

type(df['2010'])
>>> pandas.core.series.Series

    데이터프레임의 열 인덱스가 문자열 라벨을 가지고 있는 경우에는 순서를 나타내는 정수 인덱스를 열 인덱싱에 사용할 수 없다. 정수 인덱싱의 슬라이스는 뒤에서 설명하겠지만 행(row)을 인덱싱할 때 사용하므로 열을 인덱싱할 때는 쓸 수 없다. 정수 인덱스를 넣으면 KeyError 오류가 발생하는 것을 볼 수 있다.

df[0]
>>> KeyError: 0

다만 원래부터 문자열이 아닌 정수형 열 인덱스를 가지는 경우에는 인덱스 값으로 정수를 사용할 수 있다.

df2 = pd.DataFrame(np.arange(12).reshape(3, 4))
df2

df2[2]
>>>
0     2
1     6
2    10
Name: 2, dtype: int32
df2[[1, 2]]

행 인덱싱

만약 행 단위로 인덱싱을 하고자 하면 항상 슬라이싱(slicing)을 해야 한다. 인덱스의 값이 문자 라벨이면 라벨 슬라이싱도 가능하다.

df[:1]

df[1:2]

df['서울':'부산']

개별 데이터 인덱싱

데이터프레임에서 열 라벨로 시리즈를 인덱싱 하면 시리즈가 된다. 이 시리즈를 다시 행 라벨로 인덱싱 하면 개별 데이터가 나온다.

df['2010']['서울']
>>> 9631482

 

 

출처 : https://datascienceschool.net/01%20python/04.01%20%ED%8C%90%EB%8B%A4%EC%8A%A4%20%ED%8C%A8%ED%82%A4%EC%A7%80%EC%9D%98%20%EC%86%8C%EA%B0%9C.html

 

4.1 판다스 패키지의 소개 — 데이터 사이언스 스쿨

.ipynb .pdf to have style consistency -->

datascienceschool.net

'프로그래밍 언어 > Python' 카테고리의 다른 글

Python_Numpy  (0) 2022.09.06
Python_loc, iloc  (0) 2022.09.06
Python_Series  (0) 2022.09.06
Python_Pandas  (0) 2022.09.05
Python_csv파일 불러오기  (0) 2022.09.05
Comments