디지털미디어랩 머신러닝 여름캠프

2주차(5) : Pandas 다루기 - DataFrame

참고 자료

DataFrame

  • 시리즈는 1차원 벡터 데이터에 행방향 인덱스(row index)를 붙인 것
  • 데이터프레임는 2차원 행렬 데이터에 인덱스를 붙인 것
  • 2차원이므로 행방향 인덱스(row index) 뿐 아니라 열방향 인덱스(column index)도 붙일 수 있다..

데이터프레임 생성

  • data : 1차원 배열 값을 가진 딕셔너리
  • columns : 열방향 인덱스
  • index : 행방향 인덱스
In [1]:
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]
}
col = ["지역", "2015", "2010", "2005", "2000", "2010-2015 증가율"]
idx = ["서울", "부산", "인천", "대구"]

df = pd.DataFrame(data, index=idx, columns=col)
df
Out[1]:
지역 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

데이터프레임 열 인덱싱

  • 데이터프레임을 인덱싱을 할 때도 열 라벨(column label)을 키값으로 생각하여 인덱싱을 할 수 있다.
  • 인덱스로 라벨 값을 하나만 넣으면 시리즈가 반환되고 라벨의 배열 또는 리스트를 넣으면 부분적인 데이터프레임이 반환된다.
  • 데이터프레임의 열 인덱스가 문자열 라벨을 가지고 있는 경우에는 순서를 나타내는 정수 인덱스를 열 인덱싱에 사용할 수 없다.
In [ ]:
print(df["지역"])
In [ ]:
print(df[["2010", "2015"]])
In [ ]:
print(df[0])

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

In [2]:
scores = {"수학" : [50, 45, 65, 70, 80],
         "영어" : [90, 20, 55, 60, 75],
         "과학" : [20, 15, 65, 90, 95]}

df_score = pd.DataFrame(scores)
df_score
Out[2]:
과학 수학 영어
0 20 50 90
1 15 45 20
2 65 65 55
3 90 70 60
4 95 80 75
In [ ]:
df_score["평균"] = 0
print(df_score)
In [ ]:
df_score["평균"] = (df["과학"] + df["수학"] + df["영어"])/3
print(df_score)
In [ ]:
print(df_score.mean())
In [ ]:
del df_score["평균"]
print(df_score)

개별 데이터 인덱싱

데이터프레임에서 열 라벨로 시리즈를 인덱싱하고 다시 행 라벨로 개별 데이터를 인덱싱할 수 있다.

In [ ]:
#과학 0번째
print(df_score["과학"][0])
#과학 0~2번째
print(df_score["과학"][0:3])
#과학,수학의 0~1번째
print(df_score[["과학", "수학"]][0:2])
#전체 데이터프레임의 1~ 뒤에서 1번째
print(df_score[1:-1])

파일 읽어오기

  • 파일 읽어오기

    read_excel("파일경로")
    read_csv("파일경로")
  • 파일경로는 같은 폴더에 있으면 파일 이름만 입력해주면 된다.

  • 하위 경로에 있으면 폴더명/파일명
  • 상위 경로에 있으면 ../폴더명/파일명
In [ ]:
df = pd.read_excel("../data/example.xlsx")

브랜드가 Mercedes-Benz 인 데이터만 골라내기

In [ ]:
df_benz = df[df["브랜드"] == "Mercedes-Benz"]
print(df_benz)

저장하기

데이터프레임.to_excel("경로명")
데이터프레임.to_csv("경로명")
In [ ]:
df_benz.to_excel("benz.xlsx")
  • 기본옵션으로 저장하면 파일 첫 컬럼에 index 컬럼이 같이 추가된다.
  • to_excel("경로명", index=False) 와 같이 옵션을 통해 인덱스를 빼고 저장할 수 있다.
  • 파일이 열려있으면 덮어쓰기 권한이 없다.
In [ ]:
df_benz.to_excel("benz.xlsx", index=False)

시트명

  • sheet_name 옵션을 통해 시트명을 정할 수 있다.
  • to_excel("경로명", sheet_name="시트명")
In [ ]:
df_benz_auto = df_benz[df_benz["수행기능"] == "AUTO"]
print(df_benz_auto)
In [ ]:
df_benz_auto.to_excel("benz.xlsx", index=False, sheet_name="AUTO")

ExcelWriter

  • sheet_name을 정해주어도 계속 덮어씌워져 여러개의 시트를 만들 수는 없다.
  • ExcelWriter를 이용해서 여러 시트를 저장할 수 있다.
writer = pd.ExcelWriter("경로명")
데이터프레임1.to_excel(writer, "시트명1")
데이터프레임2.to_excel(writer, "시트명2")
writer.save()
In [ ]:
df_benz_auto = df_benz[df_benz["수행기능"] == "AUTO"]
df_benz_radio = df_benz[df_benz["수행기능"] == "RADIO"]

writer = pd.ExcelWriter('benz.xlsx')
df_benz_auto.to_excel(writer, 'AUTO')
df_benz_radio.to_excel(writer, 'RADIO')
writer.save()

실습

  • 데이터 프레임과 반복문을 활용하여 모든 수행기능을 시트별로 나누어 저장해보자.
  • 힌트 : 수행기능의 종류는 list(set(df["수행기능"]))로 가져올 수 있다.