Python의 Operator precedence

  • #operator_precednce
  • 다음과 같은 조건문을 사용하려고 하는데 연산자 우선순위가 맞나?
    1
    2
    3
    
    # 의도: a_file 이나 b_file이 아직 준비가 안되었으면 do_something()을 수행하자
    if not is_ready.a_file or not is_ready.b_file:
      do_something()
    
  • 해답은 Operator Precedence, docs.python.org 에 있다.
  • not의 우선순위가 or보다 높으므로 위 예제는 의도대로 수행된다

dictionary Comprehension의 특이 사례

pandas Dataframe Cell에 List 값을 Value로 넣기

예제

  • 다음과 같은 Dataframe을 만들고 싶다

      남산도서관 양천도서관 동작도서관
    9783478 [‘1234’, ‘4567’] [‘5678’] NaN
  • 흔히 범하는 실패 사례 1 : index 설정 오류 ( TypeError: ~ )
    1
    2
    3
    4
    5
    
    lib_dict = {'남산도서관': ['1234', '4567'], '양천도서관': ['5678']}
    df = pd.DataFrame(lib_dict, index='9783478', columns=['남산도서관', '양천도서관', '동작도서관'])
    >>> 
    ....
    TypeError: Index( ... ) must be called with a collection of some kind, '97834578' was passed
    
    • pandas.DataFrame API reference를 참조해보면 index or array-like 라고 되어있다
    • pd.Index 형식이나 배열을 넘기라는 얘기. 한 줄이라도 ['97834578'] 처럼 list로 감싸서 보내야함
  • 흔히 범하는 실패 사례 2 : value 설정 오류 ( ValueError: ~ )
    1
    2
    3
    4
    5
    
    lib_dict = {'남산도서관': ['1234', '4567'], '양천도서관': ['5678']}
    df = pd.DataFrame(lib_dict, index=['9783478'], columns=['남산도서관', '양천도서관', '동작도서관'])
    >>> 
    ....
    ValueError: Shape of passed values is (2, 3), indices imply (1, 3)
    
    • Add List as value in pandas Dataframe, stackoverflow를 참조
    • 일단 아래와 같은 형식을 만들려면 lib_dict를 어떻게 구성했을지 생각해보자

        남산도서관 양천도서관 동작도서관
      9783478 ‘1234’ ‘5678’ NaN
      9783459 ‘4567’ NaN NaN
      • 아마 위의 코드에서 index만 고쳐주면 된다. 즉 현재 lib_dict 설정이 원래 의도와는 다르다.
      • 현재 pandas에서 값으로만 판단했을때 index=2개 , columns=3개 형식 으로 판단하고 있음
    • 그런데 index 형식은 index=1개, columns=3개로 넘겨줘서 서로 형식이 안 맞는다며 불평하는 것임
    • 원래 원하던 형식이 [‘1234’, ‘4567’] 을 하나의 값으로 보는 것 이었으므로
      • 겉으로 봐서 한 개처럼 보이게 만들어줘야 함
      • 즉, [] 으로 한 번 더 감싸줘야 함
  • 최종 형태
    1
    2
    3
    4
    5
    6
    7
    
    lib_dict = {'남산도서관': [ ['1234', '4567'] ], '양천도서관': [ ['5678'] ]}
    df = pd.DataFrame(lib_dict, index=['9783478'], columns=['남산도서관', '양천도서관', '동작도서관'])
    with dataframe_print_option:
      print(df)
    >>>
                남산도서관 양천도서관 동작도서관
    97834578  [1234, 4567]     [5678]        NaN
    

읽는 책

Fluent Python

관심주제