뭔가 마법같이 되는게 있을 것 같은데.
pd.DataFrame.query를 써보았는데 string은 적용하기가 어려운듯?
급해서 대충 스킵했지만 문서에 eval 뭐시기뭐시기 한거 보니,
쿼리문에 따옴표 넣었으면 되었을수도...?
아무튼 내 코드는 뭔가...
walkaround인 느낌.
개선가능하지 않을까?
그냥 같은 코드 여러개 복붙해도 되는데
꼴에 잘 써보겠다고 이리저리 삽질한건 비밀.
괜히 시간낭비함.
from functools import reduce
# 2-1
def solve_02_01(df: pd.core.frame.DataFrame):
conditions = {
"City": "Beijing",
"Sport": "Archery",
"Country_Code": "KOR",
"Medal": "Gold"
}
masks = []
for col, val in conditions.items():
masks.append(df[col] == val)
full_mask = reduce(lambda x, y: x * y, masks)
return df[full_mask]
df_archery = solve_02_01(df_target)
check_02_01(df_archery)
연도, 메달 별로 pivot table 하는데
메달이 자꾸 abc 순으로 정렬돼서...
어떻게든 했는데 정석적으로 한 건 아닌듯?
팀원들한테 좀 물어봐야겠음
sort_index에 parameter인 key에 dictionary 넣으면 된다는데
공식문서를 아무리 읽어봐도 key에 dictionary 넣으면 된다는 얘기는 없는데?
caller은 뭔지... dictionary가 caller이 되나?
이름 딱보면 뭔가 함수, class를 통칭하는 것 같은데...
공식문서에서 caller을 찾아보았을 때 caller에 대한 의미를 명확히 설명하는 내용은 없었다.
대충 찾아보니 예상대로 함수와 관련된 것이었다.
결론은 sort_index의 key paramter에 dictionary를 넣으면 안되고, 정렬 기준을 알려주는 함수를 넣어줘야 하지 않나 싶다.
추가로, pivot_table 메서드는 자동으로 인덱스를 정렬하며 원하지 않으면 pd.pivot_table(...arguments, sort=False)
를 해주면 된다.
또한, multi index의 경우 sort_index를 통해서 하나의 index를 정렬하니 나머지도 자동으로 정렬되는 특징이 있었다. 이 때 sort_remaining이라는 parameter 값에 False를 전달해주면 나머지를 자동정렬하지 않는다.
흠.. 뭔가 간단하게 할 수 있는 방법이 있을 것 같은데.
이렇게까지 복잡하게 해야한다고?
# 2-2
def custom_sorter(series):
return series.map({
"Gold": 0,
"Silver": 1,
"Bronze": 2
})
def solve_02_01(df: pd.core.frame.DataFrame):
return df[df["Country_Code"] == "KOR"] \
.drop(["Athlete", "Gender"], axis=1) \
.drop_duplicates() \
.loc[:, ["City", "Year", "Medal"]] \
.pivot_table(index=["Year", "Medal"], aggfunc='count') \
.sort_index(level=1, key=custom_sorter) \
.sort_index(level=0, sort_remaining=False)
df_kor = solve_02_01(df_target)
check_02_02(df_kor)
어차피 표 데이터를 보기 위해 pandas를 쓰는 것은
"비교적" 적을 듯 하다.
category도 모두 숫자형태로 바꿔주고,
별도로 숫자값과 string value를 매핑시켜주는 방식이 되지 않을까?
아무래도 string 값을 유지보수하는 건 무척 귀찮고 힘든 일이니까.
그래서 쉬운 방법이 없는걸지도 모르겠다.