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.