pip install chardet
import chardet
with open('./datas/Summer-Olympic-medals-1976-to-2008.csv', 'rb') as rawdata:
result = chardet.detect(rawdata.read(10000))
# check what the character encoding might be
print(result)
➡️ encoding 값 찾기
df_target = pd.read_csv('./datas/Summer-Olympic-medals-1976-to-2008.csv',encoding='ISO-8859-1')
➡️ 데이터 불러오기
read_csv 시 UnicodeDecodeError를 해결하기 위해
chardet 라이브러리를 통해 encoding 값을 알 수 있는 방법을 찾았다.
- 참고링크 : https://gmnam.tistory.com/291
해당값를 read_csv의 encoding값으로 넣어서 데이터를 불러왔다.
df_target = df_target[df_target['City'].notnull()]
- 데이터 info() 확인 시
RangeIndex값과 Non-null Count 값이 달라서
특정 컬럼에 notnull()한 값을 데이터프레임에 넣어서 해결하였다.
또는 dropna()를 사용할 수도 있다.- 참고링크 : https://blog.naver.com/snowstormaw/222863967632
df_target['Year'] = df_target['Year'].astype(int)
info() 확인시 Year데이터만 float64 그외는 object이므로
Year 컬럼만 astype 메서드를 이용해 int로 변경해주었다.
import copy
df_copy = df_target.copy()
# 2008 베이징 양궁 금메달 + 대한민국
df_archery = df_copy.loc[(df_copy["Medal"] == 'Gold')].loc[(df_copy["Sport"] == "Archery")].loc[(df_copy["City"] == "Beijing")].loc[(df_copy["Year"] == 2008)].loc[(df_copy["Country"] == "Korea, South")]
loc를 활용해 특정 데이터만 가져올 수 있다.
# 대한민국 데이터만 추출
df_kor = df_copy.loc[(df_copy["Country"]== "Korea, South")]
# 중복데이터 제거
df_kor = df_kor.drop_duplicates(["City","Year","Sport","Discipline","Event","Country_Code","Country","Event_gender","Medal"])
#피봇테이블
df_kor = df_kor.pivot_table("City",index=["Year","Medal"], aggfunc="count")
#medal = ['Gold','Silver','Bronze']
#df_kor.sort_index(level=["Year","Medal"],ascending=[True,True],key=lambda x: x.map({ k: i for i, k in enumerate(medal)}))
# 각각 정렬
df_kor.sort_index(level=["Year"],ascending=True)
df_kor = df_kor.reindex(["Gold","Silver","Bronze"],level=1)
- 중복데이터 삭제를 위해 drop_duplicates() 사용 : https://wikidocs.net/154060
- sort_index의 key옵션을 사용하여 메달정렬을 하려 했으나,
연도를 정렬하면 메달정렬이 안되고, 메달을 정렬하면 연도 정렬이 풀리는... : https://wikidocs.net/153330- 결국 돌고 돌아 reindex로 해결 : https://kongdols-room.tistory.com/163
# 깊은복사
df_copy = df_target.copy()
# 애틀란타 올림픽 데이터 추출
df_copy = df_copy.loc[(df_copy["City"]== "Atlanta")].loc[(df_copy["Year"] == 1996)]
# 중복 데이터 제거
df_copy = df_copy.drop_duplicates(["City","Year","Sport","Discipline","Event","Country_Code","Country","Event_gender","Medal"])
# country, medal 데이터만 뽑고 / count를 기준으로 group_by().count() / 매달 내림차순으로 정렬
df_rank_10 = df_copy[['Country', 'Medal']].groupby('Country',as_index=False).count().sort_values(by="Medal",ascending=False)
group by 참고링크 : http://www.teddynote.com/pandas/pandas-groupby/
# 컬럼생성
df_copy["Gold"] = np.NaN
df_copy["Silver"] = np.NaN
df_copy["Bronze"] = np.NaN
# 값 채우기
for idx, row in df_copy.iterrows():
if row["Medal"] == "Gold" :
df_copy.at[idx,"Gold"] = 1
elif row["Medal"] == "Silver" :
df_copy.at[idx,"Silver"] = 1
elif row["Medal"] == "Bronze" :
df_copy.at[idx,"Bronze"] = 1
#필요컬럼만 뽑아서 / group by().sum()하고 / 정렬 / 10위만 뽑기
df_rank_10 = df_copy[["Country","Gold","Silver","Bronze"]].groupby("Country",as_index=False).sum().sort_values(by=["Gold","Silver","Bronze"], ascending=[False,False,False]).head(10)
at 사용법 : https://devocean.sk.com/blog/techBoardDetail.do?ID=164657&boardType=techBlog