표를 맘대로 조작하는 건 힘들어

I'm Cape·2023년 6월 25일
0

EDA Test3 피드백

테이블에서 복수 조건 적용하기

뭔가 마법같이 되는게 있을 것 같은데.
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)

멘붕왔던 MultiIndex sorting

연도, 메달 별로 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 값을 유지보수하는 건 무척 귀찮고 힘든 일이니까.
그래서 쉬운 방법이 없는걸지도 모르겠다.

profile
Impact

0개의 댓글