파이썬 DataFrame 인덱싱 하는 방법(df[ ], df.loc[ ], df.iloc[ ])

bearwoong

·

2020. 4. 7. 07:15

728x90
 

DataFrame은 python list 나 numpy array 처럼 여러 값을 저장할 때 쓴다. 하지만 DataFrame은 저장되는 자료형에 제약이 없고, column 이름이나 row 이름을 지정해줄 수 있어서 데이터를 관리하기에 훨씬 편리한 면이 있다.

 

 

DataFrame 인덱싱 방법

DataFrame 을 인덱싱 하는 방법은 바로 인덱싱하는 방법, loc[ ], iloc[ ] 이렇게 세 가지 방법이 있다. 어떤 방법을 써도 되지만 DataFrame에서 인덱싱하는 방법이 좀 일관성이 없는 면이 있어서 한 번 정리를 하고 지나가는 것이 좋다. 아래와 같은 DataFrame이 있다고 가정해본다. (DataFrame 이름은 df로 한다.)

DataFrame 예시

 

df[ ] - 바로 인덱싱하는 방법

이 방법 때문에 DataFrame 인덱싱 하는 방법이 헷갈리게 된다.

 

df["column"] 

이렇게 column을 바로 인덱싱할 수 있다.
df["성별"]처럼 인덱싱하게되면 "성별" column에 있는 "남", "남", "여", "남"이 인덱싱 된다.
즉 print(df["성별"])을 하게 되면 아래와 같은 결과를 볼 수 있고, 이 df["성별"]은 DataFrame 타입이다.

df["성별"] 결과

df[리스트]

df[리스트]가 되면 리스트의 column들이 인덱싱된다. 
df[["성별", "직업"]] 이렇게 column으로 리스트를 만들어서 인덱싱하면 "성별" column과 "직업" column이 인덱싱되고 이것 또한 DataFrame 타입이다.

df[["성별", "직업"]] 결과

df[리스트 슬라이싱]

이 부분이 가장 헷갈리는 부분이다. 위와는 다른게 리스트 슬라이싱이 들어가게되면 column을 인덱싱하는 것이 아니라 row를 인덱싱한다. 당연히 df["성별":"직업"]을 하면 "성별", "나이", "직업"이 인덱싱될 것 같지만 에러가 난다.
이 때는 row를 리스트 슬라이싱 해줘야 한다. 예를들어 df["토니 스타크" : "나타샤"] 이런식으로 말이다. 그럼 아래와 같은 결과를 볼 수 있다. 마찬가지로 DataFrame 타입이다.

df["토니 스타크" : "나타샤"] 결과

 

df.loc[ "row" , "column" ]

loc를 활용해서 인덱싱 하는 방법은 헷갈일 일이 없어서 편하다. 첫 번째에는 인덱싱할 row를 넣고, 두 번째에는 인덱싱할 column을 넣으면 된다. row나 column의 이름을 넣어도 되고, 리스트를 넣어도 되며, 리스트 슬라이싱을 넣어도 원하는 결과가 나온다. row나 column자리에 : 를 쓰게되면 전체를 인덱싱한다는 뜻이다. 예를들어 df.loc[:, "나이"]를 한다면 모든 row의 나이를 인덱싱하게 된다.

 

print(df.loc["토니 스타크"])
print(df.loc[["토니 스타크", "토르"]]
print(df.loc["토니 스타크":"토르"]
print(df.loc[:, "나이"])
print(df.loc[:, ["성별", "직업"]])
print(df.loc[:, "성별" : "직업"])

 

아래 결과는 위에서 인덱싱한 것을 순서대로 넣은 것이다.

df.loc[ ] 결과들

 

df.iloc[0, 0]

df.iloc[ ]는 row와 column의 이름을 그대로 쓰는 것이 아니라 각 row와 column의 인덱스 값으로 인덱싱하는 방법이다.
위의 DataFrame에서 column의 "성별", "나이", "직업", "취미" 는 순서대로 0, 1, 2, 3의 인덱스 값을 가진다. 마찬가지로 row의 "토니 스타크", "스티브 로저스", "나타샤", "토르"는 순서대로 0, 1, 2, 3의 인덱스 값을 가진다. 

인덱스 값만 알면 나머지는 위의 loc에서 했던것과 똑같다. 인덱스 값을 넣거나, 리스트로 만들어서 넣거나, 리스트 슬라이싱으로 넣으면 원하는 결과가 나오는 것을 볼 수 있다.

print(df.iloc[0])
print(df.iloc[[0, 2]])
print(df.iloc[0:2])
print(df.iloc[:, 0])
print(df.iloc[:, [0, 2]])
print(df.iloc[:, 0:2])

아래 결과는 위에서 인덱싱한 것을 순서대로 넣은 것이다.

df.iloc[ ]의 결과들

여기서 주목해야 할 점은 리스트 슬라이싱을 한 3번째와 6번째 결과이다.
둘다 [0:2]로 리스트 슬라이싱을 했는데 0과 1의 인덱스값을 가지는 column과 row만 인덱싱된 것을 확인 할 수 있다.
loc에서 row와 column의 이름으로 리스트 슬라이싱 할 때와는 차이점이 있으니 주의해야한다.

 

함께보면 좋은 포스팅

 

파이썬 DataFrame, Series 리인덱싱 하는 방법 (df.index, df.set_index, df.reindex)

파이썬 리스트의 메모리 저장

numpy array와 python list의 차이 - 코드잇 (+pandas DataFrame)

반응형