프로그래밍/python
PYthon_판다스(pandas)_(3)
gunnwu
2023. 2. 25. 15:58
1. 데이터 변경하기
1- 1. 열삭제
- df.drop()메소드 사용
이전글과 마찬가지로 superstore데이터 사용
#열삭제
#Country,Postal Code삭제
store.drop(['Country','Postal Code'], axis=1,inplace=True) #inplace는 바로 반영한다는 뜻.
store.head()
1- 2 열 이름 바꾸기
- rename(columns={ : })
#Segment 열이름 바꾸기 class로
store.rename(columns={'Segment' : 'Class'},inplace=True)
store.head()
※ 범주값을 숫자로 변경하기(알고만 있자) => 가변수화 사용할거니까
# 타이타닉 데이터로 Sex컬럼의 male=1, female=0 으로 변경
# 범주값이 (남,여),(yes,no)처럼 두개일땐 map함수로 가능
# 하지만 다시 독립된 열로 변경하는 과정이 필요
# 가변수화가 한번에 가능 => 가변수화 사용
# 알고만 있자
titanic['Sex'] = titanic['Sex'].map({'male': 1 , 'female':0})
1- 3 새로운 열 추가
- 그냥 더하면 됨
# profit, sales 합인 ex열 추가
store['ex']=store['Profit']+store['Sales']
store.head()
1- 4 범주값 만들기(연속값을 범주로)
- 범주값 만들기
- 연속값을 구간으로 나누어 표현 (이산화)
- cut()함수 => 크기를 기준으로 구간 나누기 범위 개수를 지정하면 자동으로 크기를 나눈다.
- 구간마다 들어가는 개수는 다르다.
# store 크기를 기준으로 Quantity를 4구간(a ~ d)으로 나누기
store['store_grp'] = pd.cut( store['Quantity'] , 4 ,labels=list('abcd') )
# (]==> (는 포함하지 않음
store.head()
- 경계값을 직접 지정해서도 만들 수 있다. (4분위수로 경계값 지정)
# 등급 구하기 4분위수의 경계값.
q1 = store['Quantity'].describe()['25%']
q2 = store['Quantity'].describe()['50%']
q3 = store['Quantity'].describe()['75%']
my_bin = [-np.inf, q1, q2, q3, np.inf]
my_label = ['a', 'b', 'c', 'd']
store['store_grp2'] = pd.cut(store['Quantity'] ,bins=my_bin, labels=my_label )
# 확인
store['store_grp2'].value_counts()
- 개수를 기준으로 구간을 나누고 싶을 때 qcut() 함수를 사용.
- 구간 개수를 지정하면 자동으로 동일한 개수를 갖는 구간이 만들어집니다.
- 사분위수로 직접 나눈것과 동일한 결과
store['store_grp3'] = pd.qcut( store['Quantity'] ,4 ,labels=list('abcd') )
# 확인
store.head()
1- 5. 가변수화
- 일정하게 정해진 범위의 값을 갖는 범주형 데이터를 독립된 열로 변환
- 범주형 문자열 데이터를 숫자로 바꾼다(머신러닝 돌릴때 필요)
- get_dummies()
- 다중공선성 문제를 없애기 위해 drop_first=True 옵션을 지정
- 다중공선성이란 ? : 독립변수들 간의 높은 선형관계가 존재하는것. 회귀분석의 전제를 위배
- 자동으로 원본 열이 제거되고, 열 이름이 prefix로 사용
# 똑같이 superstore를 새롭게 선언
df = pd.read_csv('C:\\Users\\User\\data\\SampleSuperstore.csv',encoding='CP949')
#데이터 타입을 확인해서 범주형 데이터를 선택
df.info()
#'Ship Mode','Segment' 컬럼을 가변수화
df = pd.get_dummies(df, columns=['Ship Mode','Segment'], drop_first=True)
df.head()