본문 바로가기
Python/Python DataAnalysis

[Python Data Analysis] 4. DataFrame 객체

by Rosmary 2021. 11. 2.
728x90
반응형

 

 

 

 

이번 포스팅에서는 Pandas의 기본 객체인 DataFrame에 대해 알아보려 한다. 이전의 포스팅에서 살펴봤듯이, Pandas 모듈은 여러 형태의 파일에 기록된 데이터를 DataFrame이라 불리는 표 형태의 객체로 불러들일 수 있다. DataFrame을 살펴보기 위해, 지난 포스팅에서 사용한 json 파일로부터 내용을 추출하여 DataFrame 객체로 변환을 먼저 진행했다.

 

 

본격적으로, DataFrame 구조를 알아보고, 이 객체를 어떻게 활용할 수 있는지 알아보도록 하자.

 

 

1. DataFrame의 정보 확인

 

데이터에 사용하는 표는 2차원 구조를 띄고 있다. 일반적으로 이 2차원 표에서 가로축은 개별 데이터에 대한 정보가 작성되고, 새로 축은 개별 데이터 중, 특정 정보의 집합을 나타낸다. 가로축의 개별 데이터는 행(Row), 인덱스(Index) 레코드(Record), 튜플(Tuple) 등의 이름으로 불리며, 새로축은 열(Column), 필드(Field), 속성(Attribute)라는 이름으로 불린다. 

 

 

표에서 필드값을 나타내는 용어가 필드명이며, 위의 그림에는 표시되지 않았지만 레코드의 순번을 나타내는 용어는 index라고 한다. DataFrame 객체 내에 DataFrame의 Index와 필드명만을 별도로 추출하는 클래스 변수가 존재한다. 

 

# pandas.DataFrame.index      : DataFrame의 순번 정보를 표시.

# pandas.DataFrame.columns  : DataFrame의 필드명 정보를 표시.

# pandas.DataFrame.axes       : DataFrame의 순번, 필드명 정보를 동시에 표시

# pandas.DataFrame.dtypes    : 각 필드값의 데이터 타입을 표시.

# pandas.DataFrame.values     : DataFrame 내 데이터를 Array 형태로 표시

# pandas.DataFrame.shape     : DataFrame의 크기가 M x N인 경우, 이 값을 Tuple로 표시(M,N)

# pandas.DataFrame.loc[index] : DataFrame의 특정 행 정보를 표시.

# pandas.DataFrame.loc[index, Column]: 특정 index의 Column 값 표시

   *  pandas.DataFrame.at[index, column]과 동일한 결과

# pandas.DataFrame.loc[index_low:index_high, Column]: 특정 index 범위 내의 Column 값 표시

# pandas.DataFrame.loc[[index1, index2]]: index1, index2의 정보 출력

# pandas.DataFrame["Column명"] : DataFrame 내 명시된 필드값만 표시

# pandas.DataFrame[["Column명1", "Column명2"]]: DataFrame 내 명시된 복수의 필드값 표시

# pandas.DataFrame["Column명"]["Index명"]: DataFrame 내 명시된 필드값만 표시하되, 특정 index값만 출력. 

 

** loc 메서드의 의미는 location이다.

 

 

위의 캡쳐는 DataFrame 객체를 뽑은 원본 json 파일의 내용이다. 잘 보면 형태가 Python Tuple의 index, values와 유사하게 구성되어 있는데, Index 값은 Tuple의 index 값에 대응하며, 각 필드명 데이터 내에 동일하게 들어가 있는 것을 확인할 수 있다. pandas는 json 파일의 내용을 DataFrame으로 변환 시, index에 해당하는 내용(1, 2, 3)을 index로 인식하는데, pandas.DataFrame.index는 이 정보만 별도로 추출하여 화면에 출력한다. 반면에, pandas.DataFrame.columns는 DataFrame의 컬럼명(필드명) 정보만 별도로 추출하여 화면에 표시한다. pandas.DataFrame.axes는 이 두 정보를 함께 표시해준다.

 

 

pandas.DataFrame.dtypes라는 클래스 변수도 존재하는데 이 변수는 DataFrame의 필드값의 데이터 타입을 표시한다. 위의 DataFrame 예시에서 name은 string, Age는 숫자로 표시되는데, 숫자를 제외한 나머지는 데이터 타입이 object로 표시된다. 일반 Python의 변수 타입과 다르다는 점에 유의하자.

 

 

pandas.DataFrame.values 클래스 변수는 DataFrame 내의 모든 데이터 값을 Array 타입의 변수로 변환하여 돌려준다. DataFrame 내의 모든 레코드 내의 값을 리스트로 묶고, 이 리스트를 Array 타입에 한 번에 묶어 화면에 표시한다.

 

 

pandas.DataFrame.shape 클래스 변수는 DataFrame 크기를 Tuple 형태로 반환한다. 위의 예시에서 DataFrame은 3 by 3 형태의 표이므로, json_df.shape의 결과값은 (3, 3)으로 반환되게 된다.

 

 

pandas.DataFrame.loc은 DataFrame의 특정 records 정보를 추출하는 클래스 변수다. 특이하게도 loc 변수는 일반적인 매서드 인자를 넣는 괄호()가 아니라 LIst 형태의 괄호를 사용한다. pandas.DataFrame.loc[index] 형태로 사용하면 된다.

 

복수 개 이상의 index에 지정된 값을 확인하고 싶을 때는 List 형태의 괄호를 이중으로 표기한 뒤, 내부에 콤마(,)로 index를 구분하여 작성한다. 

 

 

인덱스 내의 특정 값만 취하고 싶을 때는, List 형태의 괄호를 하나만 쓰되, [index, Column명] 순으로 loc 함수를 사용하면 된다.

 

 

만약 특정 범위 내의 index로부터 특정 column 값만 추출하고자 한다면, index 값 사이 콜론(:)을 삽입하여 확인하면 된다. 아래의 예시는 첫 index 정보로부터 2번째 index 정보까지 name만을 추출하는 코드다.

 

 

 

 df.loc 내부 값은 Boolean도 인식하는데, Boolean은 List 내의 위치에 따라 해당 Index를 표시할지 말지를 결정한다. 예를 들어 필자가 Index1, 2의 인적 사항만 확인하려 한다면,

 

 

위와 같은 형태로도 확인이 가능하다.

 

 

[DataFrame 정보 확인 코드의 응용]

이제 응용을 해보도록 하자. 필자가 위의 예시의 세 사람 중, 나이가 21살인 사람만 Nation을 France로 바꾼다고 하자. 이를 위한 코드로 우선, df.loc 함수를 사용해야 할 것이며, loc 내에는 df["Age"] == 21을 명시하여 21살인 사람의 정보를 뽑아야 할 것이다.

 

앞서 df.loc[index, column]은 특정 index의 특정 column 값을 뽑는 코드라고 설명했다. 그럼, 아래와 같이 코드를 작성할 경우, 필자는 21살인 사람의 국적 정보를 확인할 수 있게 된다.

 

 

필자가 추출하려 했던, 21살인 사람의 국적이 출력되었다. 이제 필자는 이 사람의 국적을 변경할 것이다.

 

참 쉽죠?

 

 

 

2. 무로부터 DataFrame 창조하기

 

그럼, 여기서 한 가지 의문점이 생긴다. 

 

"반드시 파일에 작성된 데이터만 호출해서 pandas로 읽어야만 DataFrame 객체가 생성되나요? 우리가 직접 DataFrame 객체를 생성할 수는 없는건가요?"

 

중요하지 않은 질문이라 생각할 수 있는데, 사실 우리가 익숙해져야하는 DataFrame 객체의 구조를 자각할 수 있다는 점에서 매우 중요한 질문이다. 왜냐하면 구조를 모르고는 데이터를 생성하거나 활용하는데 제약이 있을 수 밖에 없으니까.

 

서두에, Data를 나타내는 표는 2차원의 구조를 가지고 있다고 언급했다. 따라서 DataFrame객체의 경우, 반드시 index와 column명, 그리고 실제 데이터 값을 필연적으로 가지고 있을 수 밖에 없다.

 

따라서, 필자가 간단한 DataFrame을 생성한다고 하면, 이 DataFrame에는 입력할 데이터값과 index, column명에 대한 정보만 있으면 된다. 생성 방법은 크게 두 가지가 있는데, Index를 중심으로 데이터를 넣는 방법을 사용하거나 Dictionary 형태로 데이터를 넣는 방법이 있다. 

 

필자가 위에서 예시를 들었던 3명의 인적사항 데이터를 무에서부터 창조해보겠다. 먼저 첫 번 째 방법으로 DataFrame 객체는 다음과 같이 표시할 수 있다.

 

DataFrame( [ [index1의 데이터 집합],  [index2의 데이터 집합], [index3의 데이터 집합] ]

                index = ["index이름1", "index이름2", "index이름3"]

                columns = ["column이름1", "column이름2", "column이름3"]

)

 

중요하게 봐야하는 부분이 실제 index 데이터가 입력되는 값이다. 데이터 입력값은 각 index의 정보가 하나의 List로 표시되는데, 이를 도식화하면 아래와 같이 된다.

 

[ "Alex", 19, "USA" ]

Alex 19 USA

 

두 번째 index 정보를 추가해보자.

 

[ "Breta", 20, "Germany" ]

Breta 20 Germany

 

각각의 index에 대한 List가 표로 도식화되지만 이들은 하나의 표로 병합되지는 않았다. 이 역할을 하는 것이 가장 바깥의 대괄호 []이며, 이들이 내부 index 정보를 하나로 묶어야만 비로소 여러 레코드(Index)를 가지는 데이터로 거듭날 수 있게 된다.

 

[ [ "Alex", 19, "USA" ], [ "Breta", 20, "Germany" ] ]

Alex 19 USA
Breta 20 Germany

 

여기에 index명과 columns 이름 정보가 추가되면 아래와 같은 표로 나타낼 수 있다.

  name Age Nation
1 Alex 19 USA
2 Breta 20 Germany

 

최종적으로, 필자가 생성하고자 하는 DataFrame 객체는 아래의 코드로 만들 수 있다.

 

pandas.DataFrame( [ [ "Alex", 19, "USA" ], [ "Breta", 20, "Germany" ], [ "Charles", 21, "France" ] ], index = [1, 2, 3], columns = ["name", "Age", "Nation"])

 

 

 

 

다음으로 Dictionary로 DataFrame을 생성하는 두 번 째 방식이다. Index 방식과 달리, 집합으로 묶이는 대상값이 어떤 것을 가리키는 것인지 별도의 key 값으로 명시해주어야 한다. 도식화하자면,

 

data = { "name" : ["Alex", "Breta", "Charles"],

        "age"   :  [19, 20, 21],

        "nation": ["USA", "Germany", "France"]

}

 

로 나타낼 수 있다. 이렇게 Dictionary 형태로 만들어진 데이터를 pandas.DataFrame으로 아래와 같이 호출한 결과를 특정 변수에 저장하면, 우리가 위에서 보았던 DataFrame과 동일한 결과를 화면에서 볼 수 있다.

 

df = pandas.DataFrame(data)

 

data 변수값을 DataFrame으로 불러오면, Index가 0부터 순차적으로 자동 부여된다. 만약 이 Index 값을 별도로 지정한 값으로 바꾸어주고 싶다면, DataFrame의 인자값으로 index를 지정하면 된다.

 

df = pandas.DataFrame(data, index = ["no1", "no2", "no3"])

 

또한, DataFrame 생성 시, 특정 Column으로만 구성된 DataFrame을 만들고 싶다면, Column을 인자로 사용하여 지정할 수도 있다.

 

df = pandas.DataFrame(data, index = ["no1", "no2", "no3"], columns = ["name", "nation"])

 

 

 

 

3. DataFrame 객체 내용을 다른 파일 형식으로 변환하기

 

이전의 포스팅에서 필자는 다양한 형태의 파일에 저장된 데이터를 DataFrame으로 읽어오는 방법에 대해 설명했다. 그러면 역으로, DataFrame을 다양한 형태의 파일에 저장할 수 있도록 포맷을 변경하는 것도 가능하지 않을까?

 

dir(pandas.DataFrame) 내에 to_로 시작하는 매서드들이 몇 개 있다. 

 

 

이들 메서드들의 이름에서 기능이 바로 유추되는데, DataFrame 형태의 자료를 각 파일 형태에 맞는 포맷으로 변환하는 매서드들이다. 따라서 이들 메서드를 통해 아래와 같이 데이터를 변경하는 것이 가능하다.

 

 

 

 

다음 포스팅에서는 DataFrame의 Primary Key값으로 활용되는 index와 관련된 함수에 대해 알아보려 한다.

 

 

 

Fin.

반응형

댓글