pandas 기초 사용법
필요하여 찾다가 알게된 기초 사용법 적음
    pandas python
    - dataframe에서 값 counting 하기
 - 특정 기간의 “연도-달” list를 생성하는 간단한 방법
 - pandas로 날짜 끼리 비교하기
 - Series 내 에서 특정 데이터가 있는지 확인할 때 자주 혼동함
 
dataframe에서 값 counting 하기
- Count number of records by categroy, pandas official
 - 
pd.Dataframe.value_counts()함수를 사용한다 
특정 기간의 “연도-달” 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
 - 
    
위 함수는 오류가 있다
- 참고할 SO답변1 링크 : Using in operator with Pandas series
 - 참고할 SO답변2 링크 : How to determine whether a Pandas Column contains a particular vaule
 - 즉, Series 객체에 직접 
in연산자를 사용하면 “Values”가 아닌 “indexes”만 검사하기 때문이다 
 
해결책
- 따라서 해결책은 
'--없음--' in self.df['상태']부분을 다음과 같이 고치는 것이다self.df['상태'].str.contains('--없음--').any()self.df['상태'].isin(['--없음--']).any()- 
self.df['상태'].eq("--없음--").any(): 가장 간결하여 선택함