본문 바로가기
개발일지/Pandas

pandas 판다스 문자열 가공 혼자서 해보기

by 다니엘의 개발 이야기 2022. 7. 28.
320x100
### 일단은 titanic raw 데이터 정리!!

import pandas as pd
titanic = pd.read_csv('titanic_imp.csv')

titanic.Survived.unique()

# array(['0', '1', 'yes', 'no'], dtype=object)

여기서부터 to_csv로 정리된걸 안쏴줬구나.. 라는것을 깨닫고 처음부터 다시 시작했다.

 

titanic.Survived.replace(['yes', 'no'], [1,0], inplace = True)
titanic.Survived.unique()
# array(['0', '1', 1, 0], dtype=object)
titanic.Survived = titanic.Survived.astype(int)
titanic.info()

'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 894 entries, 0 to 893
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype 
---  ------    --------------  ----- 
 0   Survived  894 non-null    int64 
 1   Class     894 non-null    int64 
 2   Gender    894 non-null    object
 3   Age       758 non-null    object
 4   Sipsp     894 non-null    int64 
 5   Parch     894 non-null    int64 
 6   Fare      894 non-null    object
 7   Emb       892 non-null    object
 8   Deck      203 non-null    object
dtypes: int64(4), object(5)
memory usage: 63.0+ KB
'''
# string은 데이터 타입 변환이 안된다고 했는데
# Missing Data를 ''로 바꾸어 주었고
# 그것도 string이라서 전환이 안된다길래 이렇게 NaN값으로 바꾸어 주었더니 작동 되었다.
titanic.Age = titanic.Age.replace('Missing Data', 'NaN')
titanic.Age = titanic.Age.astype('float')
titanic.head(3)

'''
	Survived	Class	Gender	Age	Sipsp	Parch	Fare	Emb	Deck
0	0	3	male	22.0	1	0	$7.25	S	NaN
1	1	1	female	38.0	1	0	$71.2833	C	C
2	1	3	female	26.0	0	0	$7.925	S	NaN
'''
titanic.Fare = titanic.Fare.replace('$', '', inplace = True)
titanic.head()

'''
	Survived	Class	Gender	Age	Sipsp	Parch	Fare	Emb	Deck
0	0	3	male	22.0	1	0	None	S	NaN
1	1	1	female	38.0	1	0	None	C	C
2	1	3	female	26.0	0	0	None	S	NaN
3	1	1	female	35.0	1	0	None	S	C
4	0	3	male	35.0	0	0	None	S	NaN
'''

# 음.. 달러만 빼주려고 했던건데 아예 값이 날라가 버렸다.
# 리셋 후 다시 시작!
titanic.head()

'''
	Survived	Class	Gender	Age	Sipsp	Parch	Fare	Emb	Deck
0	0	3	male	22.0	1	0	7.25	S	NaN
1	1	1	female	38.0	1	0	71.2833	C	C
2	1	3	female	26.0	0	0	7.925	S	NaN
3	1	1	female	35.0	1	0	53.1	S	C
4	0	3	male	35.0	0	0	8.05	S	NaN
'''

# 기존에 titanic.Fare = titanic.Fare.replace('$', '', inplace = True) 라고 해주었을대 아예 Fare컬럼의 값이 모두 날라갔다.
# 이를 방지하기 위해서
# titanic.Fare = titanic.Fare.str.replace('$', '')
# 이렇게 해주었더니 정상 작동 된다.
# str에 대한 정확한 원리는 모르겠다. 뭐 당연히 string 뭐 그런거겠지만, 잘은 모르겠다.
titanic.info()
'''

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 894 entries, 0 to 893
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Survived  894 non-null    int64  
 1   Class     894 non-null    int64  
 2   Gender    894 non-null    object 
 3   Age       717 non-null    float64
 4   Sipsp     894 non-null    int64  
 5   Parch     894 non-null    int64  
 6   Fare      894 non-null    object 
 7   Emb       892 non-null    object 
 8   Deck      203 non-null    object 
dtypes: float64(1), int64(4), object(4)
memory usage: 63.0+ KB
'''
titanic.Fare = titanic.Fare.astype('float')
titanic.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 894 entries, 0 to 893
Data columns (total 9 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   Survived  894 non-null    int64  
 1   Class     894 non-null    int64  
 2   Gender    894 non-null    object 
 3   Age       717 non-null    float64
 4   Sipsp     894 non-null    int64  
 5   Parch     894 non-null    int64  
 6   Fare      894 non-null    float64
 7   Emb       892 non-null    object 
 8   Deck      203 non-null    object 
dtypes: float64(2), int64(4), object(3)
memory usage: 63.0+ KB
'''
titanic.to_csv('titanic_imp.csv', index = False)
pd.read_csv('titanic_imp.csv')
'''


Survived	Class	Gender	Age	Sipsp	Parch	Fare	Emb	Deck
0	0	3	male	22.0	1	0	7.2500	S	NaN
1	1	1	female	38.0	1	0	71.2833	C	C
2	1	3	female	26.0	0	0	7.9250	S	NaN
3	1	1	female	35.0	1	0	53.1000	S	C
4	0	3	male	35.0	0	0	8.0500	S	NaN
...	...	...	...	...	...	...	...	...	...
889	1	1	male	26.0	0	0	30.0000	C	C
890	0	3	male	32.0	0	0	7.7500	Q	NaN
891	0	2	male	24.0	0	0	10.5000	S	NaN
892	0	3	male	34.0	1	1	14.4000	S	NaN
893	0	3	male	36.0	0	0	7.8958	S	NaN
894 rows × 9 columns
'''


### 다음으로는 summer raw데이터 정리!!!

summer = pd.read_csv('summer_imp.csv')
summer.head()

'''
	Year	City	Sport	Discipline	Athlete Name	Country	Gender	Event	Medal
0	1896	Athens	Aquatics	Swimming	HAJOS, Alfred	HUN	Men	100M Freestyle	Gold Medal
1	1896	Athens	Aquatics	Swimming	HERSCHMANN, Otto	AUT	Men	100M Freestyle	Silver
2	1896	Athens	Aquatics	Swimming	DRIVAS, Dimitrios	GRE	Men	100M Freestyle For Sailors	Bronze
3	1896	Athens	Aquatics	Swimming	Malokinis, Ioannis	GRE	Men	100M Freestyle For Sailors	Gold Medal
4	1896	Athens	Aquatics	Swimming	Chasapis, Spiridon	GRE	Men	100M Freestyle For Sailors	Silver
'''
# 우선 변경 포인트
# 1 Athlete Name의 컬럼을 Athlete_Name으로 변경
# 2 Athlete Name을 title화 하여, 문장의 앞만 대문자화 하기
# 3 Medal의 Gold Medal을 Gold로 변환
# 1 Athlete Name의 컬럼을 Athlete_Name으로 변경

# 기억이 안났었다. 그래서 블로그에 썼던 글을 확인했다.
# 컬럼 이름 변경 방법!!
# summer['Athlete Name'] = summer.Athlete_Name
summer.rename(columns = {'Athlete Name':'Athlete_Name'}, inplace = True)

# 변경 성공
# 2 Athlete Name을 title화 하여, 문장의 앞만 대문자화 하기

summer.Athlete_Name = summer.Athlete_Name.str.title()
summer.head()

'''
    Year	City	Sport	Discipline	Athlete_Name	Country	Gender	Event	Medal
0	1896	Athens	Aquatics	Swimming	Hajos, Alfred	HUN	Men	100M Freestyle	Gold Medal
1	1896	Athens	Aquatics	Swimming	Herschmann, Otto	AUT	Men	100M Freestyle	Silver
2	1896	Athens	Aquatics	Swimming	Drivas, Dimitrios	GRE	Men	100M Freestyle For Sailors	Bronze
3	1896	Athens	Aquatics	Swimming	Malokinis, Ioannis	GRE	Men	100M Freestyle For Sailors	Gold Medal
4	1896	Athens	Aquatics	Swimming	Chasapis, Spiridon	GRE	Men	100M Freestyle For Sailors	Silver
'''

# 변경 완료
# 3 Medal의 Gold Medal을 Gold로 변환

summer.Medal = summer.Medal.str.replace('Gold Medal', 'Gold')
summer.head()

'''
    Year	City	Sport	Discipline	Athlete_Name	Country	Gender	Event	Medal
0	1896	Athens	Aquatics	Swimming	Hajos, Alfred	HUN	Men	100M Freestyle	Gold
1	1896	Athens	Aquatics	Swimming	Herschmann, Otto	AUT	Men	100M Freestyle	Silver
2	1896	Athens	Aquatics	Swimming	Drivas, Dimitrios	GRE	Men	100M Freestyle For Sailors	Bronze
3	1896	Athens	Aquatics	Swimming	Malokinis, Ioannis	GRE	Men	100M Freestyle For Sailors	Gold
4	1896	Athens	Aquatics	Swimming	Chasapis, Spiridon	GRE	Men	100M Freestyle For Sailors	Silver
'''

# 성공
# 공백 확인
summer.iloc[0,4]
# ' Hajos, Alfred '
# 여전히 공백이 있으므로 strip()
summer.Athlete_Name = summer.Athlete_Name.str.strip()
summer.iloc[0,4]
# 'Hajos, Alfred'
# 공백제거 완료
# 잊어버렸지만 지금 해야하는 것
# 1 필드에 해당되는 값을 보는 방법
# 2 데이터의 유니크식의 속성 - 각각의 컬럼으로써 보는건 안다. 근데 전체적으로 훑는걸 까먹었다.

summer.value_counts()
# 1 필드에 해당되는 값을 보는 방법

summer.loc[summer.Athlete_Name == 'Hajos, Alfred']

'''
    Year	City	Sport	Discipline	Athlete_Name	Country	Gender	Event	Medal
0	1896	Athens	Aquatics	Swimming	Hajos, Alfred	HUN	Men	100M Freestyle	Gold
6	1896	Athens	Aquatics	Swimming	Hajos, Alfred	HUN	Men	1200M Freestyle	Gold
'''

# 성공이지만
# SQL 처럼 정규표현으로 일부만 써줘도 호출해오는것도 있었던 것같은데?
# SQL의 정규표현식 처럼 일부분만 있어도 긁어오는 거 '%'처럼 - contains
summer.loc[summer.Athlete_Name.str.contains('Hajos')]
# 2 데이터의 유니크식의 속성 - 각각의 컬럼으로써 보는건 안다. 근데 전체적으로 훑는걸 까먹었다.

summer.iloc[:,:].describe()

'''
Year
count	31170.000000
mean	1970.483157
std	33.158454
min	1896.000000
25%	1948.000000
50%	1980.000000
75%	2000.000000
max	2012.000000
'''
# 위의 입력 값은 사실상 summer.describe()와 동일한데, 나는 이래서 원하는 답을 찾지 못했었다.
summer.iloc[:,1:].describe()

'''

        City	Sport	Discipline	Athlete_Name	Country	Gender	Event	Medal
count	31170	31170	31170	31170	31166	31170	31170	31170
unique	22	43	67	22761	147	2	666	3
top	London	Aquatics	Athletics	Phelps, Michael	USA	Men	Football	Gold
freq	3567	4170	3639	22	4586	22751	1497	10487
'''
summer.to_csv('summer_imp.csv', index = False)
pd.read_csv('summer_imp.csv')

휴... 크게 어렵진 않았지만 익숙해지고 또 익숙해져야겠다.

 

의도치는 않았지만, 이걸 혼자 하는 동안에 강의 하나분을 건너 뛰어버렸다;

300x250