본문 바로가기

판다스/판다스 팁50

apply를 무분별하게 쓰면 안되는 이유 오늘은 수강생이 올려준 코드에서 apply를 무분별하게 쓰고 있는 것을 발견했다. 그러면 안되는 이유에 대해서 알아보자 다음 예제 코드를 보자 import pandas as pd data1 = {'날짜': ['2023-01-29', '2023-01-30', '2023-01-31', '2023-01-31', '2023-02-01'] * 200000} df1 = pd.DataFrame(data1) df1 df1은 100만행의 데이터이다 df1의 날짜열을 datetime 형식으로 바꾸려면 아래와 같은 코드로 가능하다 pd.to_datetime(df1['날짜']) 그런데 수강생이 (목적은 아마도 메서드로 쓰고 싶었던 것 같다) 아래와 같은 코드로 apply로 to_datetime을 적용했다 df1['날짜'].a.. 2023. 8. 25.
[pandas] 엑셀의 날짜가 숫자로 읽어질 때 datetime으로 변환하는 방법 종종 엑셀의 날짜가 숫자로 읽어질 때가 있다 그때 datetime으로 변환하는 방법을 살펴보겠다 예제 import pandas as pd s = pd.Series([44678, 45890]) s 0 44678 1 45890 dtype: int64 s는 엑셀에서 불러온 데이터는 아니지만 엑셀의 날짜가 숫자로 불러질때와 같은 데이터가 담겨 있다 이 숫자의 의미는 1899-12-30부터 몇번째 날인지를 숫자로 표현한 것이다. (만약 소수점이 있다면 그것은 시간이다) 이것을 datetime으로 변환하려면 to_datetime의 origin을 설정하고 단위를 날(day)에 해당하는 D로 설정하면 해결된다 pd.to_datetime(s, unit='D', origin='1899-12-30') output: 0 20.. 2023. 8. 25.
[pandas] csv파일의 멀티 인덱스를 판다스로 읽었을 때 Unnamed columns가 생성된다면? 그림과 같은 멀티 인덱스를 기대하고 아래 코드를 실행했다 import io import pandas as pd csv = ''' A팀B팀C팀 삼성전자카카오삼성전자카카오삼성전자카카오 2023-08-14102030405060 2023-08-16202030405060 2023-08-17304010205060 2023-08-18304010205060 2023-08-21304030403040 ''' df = pd.read_csv(io.StringIO(csv), sep='\t', index_col=0, header=[0, 1]) df 결과는 아래와 같이 column 이름에 Unnamed가 발생했다 그 때는 아래와 같은 코드를 실행해보자 df1 = df.columns.to_frame(index=False).apply.. 2023. 8. 23.
[pandas] set과 frozenset의 차이 둘다 집합의 개념이고 중복된 value를 허용하지 않는 공통점이 있다 다만 set은 mutable하고 frozenset은 immutable하다. (이 관계는 list와 tuple의 관계와 같다) 그래서 set은 딕셔너리의 key가 될 수 없고, frozenset은 딕셔너리의 key가 될 수 있다  {set((1, 2, 2, 3)) : 'A'} TypeError: unhashable type: 'set' set은 mutable 하기에 해시할 수 없는 자료형이라 딕셔너리의 key가 될 수 없다  {frozenset((1, 2, 2, 3)) : 'A'} 위 코드는 아래를 반환한다{frozenset({1, 2, 3}): 'A'} 집합의 성격을 갖고 있기에 중복된 value인 2는 하나만 갖게 된다 set이 딕셔.. 2023. 8. 7.
[pandas] 특정 열의 값으로 데이터 프레임 나눠서 리스트로 만들기 아래의 예제를 보자 import pandas as pd data = {'종류':['사과', '사과', '귤', '사과', '바나나', '바나나'], '판매량' : [10, 20, 30, 40, 50, 60]} df = pd.DataFrame(data) df 이 df를 종류의 값으로 나눠 사과, 귤, 바나나의 데이터 프레임을 분리하고 싶다. 이것을 분리해 리스트(dfs)에 담아보자 dfs = [df for key, df in df.groupby('종류')] 확인을 위해 dfs[0]를 출력해보자 귤의 데이터 프레임을 얻었다. 혹은 아래와 같은 코드로도 가능하다 g = df.groupby('종류') dfs = [g.get_group(x) for x in g.groups] 유튜브에서 판다스 강의 중입니다 htt.. 2023. 8. 6.
[pandas] 정규표현식에서 그룹명을 지정하기 다음과 같은 시리즈 s가 있다 import pandas as pd s = pd.Series(['AAAAA-BB-CCCCCC-DD-EEE', 'CCCCCC-AA-BBB-DD-EEE']) s 0 AAAAA-BB-CCCCCC-DD-EEE 1 CCCCCC-AA-BBB-DD-EEE dtype: object s에서 A-와 그 다음에 존재하는 첫번째 - 사이의 문자열만 추출해보자 첫째 행에서는 BB를 추출하고 두번재 행에서는 BBB를 추출해야 한다 정규 표현식을 이용해 다음과 같이 추출할 수 있다 s.str.extract(r'A-(.*?)-') 이 때 정규표현식으로 그룹명을 지정하면 column의 이름이 바뀐다 그룹명을 keyword로 작성해보자 s.str.extract(r'A-(?P.*?)-') 열 이름이 keyw.. 2023. 8. 6.