dataframe에서 값 counting 하기

특정 기간의 “연도-달” list를 생성하는 간단한 방법

  • 예1 : ‘2018-09’부터 ‘2019-03’까지 1달 단위로 증가하는 String list 만들기
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    import pandas as pd
      
    period_index = pd.period_range(start='2018-09-01', end='2019-03-01', freq='M')
    print(period_index)   
    # PeriodIndex(['2018-09', '2018-10', ... , '2019-03'], dtype='period[M]', freq='M') 
     
    str_index = period_index.strftime('%Y-%m')
    print(str_index)   
    # Index(['2018-09', '2018-10', ... , '2019-03'], dtype='object') 
      
    month_list = str_index.to_list()
    print(month_list)
    # ['2018-09', '2018-10', '2018-11', '2018-12', '2019-01', '2019-02', '2019-03']
     
    # 한줄로 쓸 수도 있지만, 길어지는게 싫어서 나누어 씀
    

pandas로 날짜 끼리 비교하기

  • 시작일과 종료일을 parameter로 받는 함수를 만들 때 시작일 <= 종료일을 assertion 하고자 한다
  • datetime 라이브러리 말고 pandas로 하려고 할 때 어떻게 할까 ?
  • 다음 링크를 참조 했다. Comparing Timestamp in Python - Pandas
  • 테스트 코드
    1
    
    assert pd.Timestamp(start_date) <= pd.Timestamp(end_date), f'오류! 시작일({start_date})이 종료일({end_date})보다 미래시간임'
    

Series 내 에서 특정 데이터가 있는지 확인할 때 자주 혼동함

상황 설명

  • 우선 아래 도서대여 테이블의 경우에서
인덱스 사용자 대출기관 상태 반납일
0 철수 구로도서관 반납연기 2022-09-15
1 영희 구로도서관 반납연기 2022-09-15
2 철수 동작도서관 반납연기 2022-09-15
3 철수 동작도서관 반납연기 2022-10-01
4 영희 동작도서관 반납연기 2022-10-01
5 길동 –없음– –없음– –없음–
6 둘리 –없음– –없음– –없음–
  • 길동이와 둘리는 대여한 도서가 없는 경우 목록에서 제외하는 것이 아니라’–없음–’ 으로 표기를 하기로 했다
  • 이때 대여한 책의 갯수를 count하기 위해 ‘상태’열을 읽어서 ‘–없음–‘이 없는 갯수로 판단을 하기로 정했다

문제 분석

  • 아래는 대여한 책의 갯수를 세는 함수이다

    1
    2
    3
    4
    5
    6
    
      def total_books_counter(self) -> int:
          if '상태' in self.df.columns and '--없음--' in self.df['상태']:
              counter = len(self.df) - self.df['상태'].value_count()['--없음--']
          else:
              counter = len(self.df)
          return counter
    
  • 위 함수는 오류가 있다

해결책

  • 따라서 해결책은 '--없음--' in self.df['상태'] 부분을 다음과 같이 고치는 것이다
    • self.df['상태'].str.contains('--없음--').any()
    • self.df['상태'].isin(['--없음--']).any()
    • self.df['상태'].eq("--없음--").any() : 가장 간결하여 선택함