Post

Pandas-04. 데이터 가공, 인덱스

Pandas-04. 데이터 가공, 인덱스

04. [Pandas] 데이터 가공, 인덱스

인덱스

  • 각 행을 대표하는 대표값
  • 원칙적으로는 중복이 되면 안되지만, pandas에서는 중복을 허용 함.
1
2
# 인덱스에 별다른 처리를 하지 않으면 정수로 이루어진 RangeIndex가 자동 생성
df.index

인덱스 변경

  • 특정 인덱스 변경 : rename
  • 전체 인덱스 변경 : index = [ index list ]

행 인덱스 변경

1
2
3
4
5
6
7
8
9
10
#  행 인덱스 변경

df1 = df.copy() # 원본 손상 방지

df1.rename( 
    {
        0: 'row1', # 행 인덱스의 이름 변경 
        1 : 'row2'
    }
)
1
2
3
4
5
6
7
8
9
# 전체 행 인덱스 변경
# index = [index list]

#  - 인덱스 리스트의 길이가 데이터프레임의 행의 개수(len(df))와 같아야 한다.
sample_index = [ f"{i+1}번째 데이터" for i in range(len(df1))]
print(sample_index)

# 전체 행 인덱스 변경
df1.index = sample_index

컬럼(열 인덱스) 변경하기

  • columns 적기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    # rename을 이용해 특정 열의 이름을 바꿀 수 있다.
    # columns ={}로 컬럼과 바꿀 내용을 dict형태로
    df2 = df.copy()
    df2.rename(
      columns={
          "PassengerId": "승객번호",
          "Sex": "성별"
      }
    )
    
  • axis = 1 적기
1
2
3
4
5
6
7
8
df3 = df.copy()

df3.rename(
    {
        "PassengerId": "승객번호"
    },
    axis=1
)
1
2
# 컬럼 인덱스들 확인하기
df.columns
1
2
3
4
5
6
# 컬럼들 소문자로 바꾸기 (데이터 정제 느낌스)
lower_columns = [col.lower() for col in df.columns]
lower_columns # 컬럼 바뀐 거 확인

df3.columns = lower_columns # df3의 데이터프레임들 컬럼 lower컬럼으로 바꾸기
df3.head() # 확인하기

데이터 추가 / 삭제

행의 추가, 삭제

sample_rows = df.loc[[3, 7, 100]] # loc[]안에 지정하고 싶은 행 list를 넣은 것
sample_rows.index = ["추가1", "추가2", "추가3"] # 선택한 행의 index 변경
sample_rows

concat

1
2
df1 = df.copy()
df2 = pd.concat([df1, sample_rows]) # df1과 sample_rows를 axis=0방향으로 결합
1
2
3
4
5
# concat 사용시 주의 상항
# 반드시 두 데이터프레임의 인덱스(컬럼의 이름)의 이름이 같아야 함. 
bad_case_row = df.loc[[3, 7, 100]]
bad_case_row.columns = [1,2,3,4,5,6,7,8,9,10,11,12] # 선택한 행의 컬럼 변경
pd.concat([df1, bad_case_row]) # 없는 값들이 모두 NaN으로 채워짐.

행 삭제

drop

1
df2.drop([1, 2, 4])

행 중복값 제거

drop.duplicates()

1
2
df3 = pd.concat([df2, sample_rows])
df4 = df3.drop.duplicates() # 행의 중복 값 제거 
1
2
3
4
# 중복중에 처음 값은 남기기
df3.drop_duplicates(subset=["Embarked"], keep='first') # keep = 'first'가 기본 값
# 중복중에 마지막 값은 남기기
df3.drop_duplicates(subset=["Embarked"], keep='last')

열 추가 삭제

  • 변경이랑 추가랑 문법 같음.
1
2
3
4
df1 = df.copy()
# // 은 나눈 후에 소숫점 버리는 연산자
df1["나이대"] = df1["Age"] // 10 * 10 
df1.head()
1
2
# 없기 때문에 변경이 아니라 추가 됨.
df1["아무컬럼"] = "아무값" 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 좌석등급 컬럼을 추가
# Pclass가 1이면 최고 등급
# Pclass가 2이면 중간 등급
# Pclass가 3이면 최저 등급

# loc만 사용해서 구현하기
df2 = df.copy()

# df2에서 "Pclass"가 1인 행을 선택하고, 선택된 행들의 '좌석등급' 열에 '최고등급'을 할당함.
df2.loc[df['Pclass'] == 1, '좌석등급'] = '최고등급'
df2.loc[df['Pclass'] == 2, '좌석등급'] = '중간등급'
df2.loc[df['Pclass'] == 3, '좌석등급'] = '최저등급'

df2

열 삭제

drop

1
2
3
4
5
df4 = df.copy()

# ("Embarked", columns = "Embarekd")와 동일 
df4.drop("Embarked", axis=1) # axis=1이 없으면 pandas는 기본적으로 행(axis=0)을 삭제하려 시도함.
df4.drop(["PassengerId", "Age"], axis=1) # 여러 개도 가능

inplace

  • 데이터프레임에서 데이터를 변경할 때 사용할 수 있는 옵션.
  • inplace = False 가 기본으로서, 변경이 된 새로운 데이터 프레임이 나온다.
  • inplace = True로 설정하면 데이터프레임 객체 그 자체가 변경
1
2
3
4
5
6
7
8
9
10
# inplace = False 일 때 / 메모리 사용이 크지만 복구가 쉬움
df1 = df.copy()

df1_renamed= df1.rename(
    columns = {
        "PassengerId" : "승객번호"
    }
)

df1_renamed.head()
  • inplace = True : 기존 데이터프레임 자체가 변경됨.
1
2
3
4
5
6
7
8
9
10
# inplace = True 일 때 / 메모리 사용이 적지만 복구가 어려움
df2 = df.copy()

df2_renamed = df2.rename(
    columns = {
        "PassengerId" : "승객번호"
    },
    inplace = True # 데이터 프레임 자체가 바뀐다.
)

This post is licensed under CC BY 4.0 by the author.