pandas 18

[Pandas] 행 수를 기준으로 DataFrame split하기

개요2024.10.08-[Pandas] read_csv - 큰 데이터프레임을 행 수를 기준으로 잘라 로드하기에서 데이터가 아주 많은 CSV 파일을 로드할 때 행 수를 기준으로 작은 조각으로 나눠서 로드하고 처리했다. 그런데 이번에는 이미 처리과정에 있는 데이터프레임을 작은 조각으로 나누고 싶다.방법을 정리해 둔다.  numpy.array_split  array_split 함수는 분할할 array와 분할할 개수에 해당하는 indices_or_sections 전달받아 indices_or_sections 만큼의 하위 array 목록을 반환한다. 분할할 array에는 DataFrame도 전달할 수 있다.import numpy as npimport pandas as pddf = pd.read_csv('DimenL..

[Pandas] read_csv - 큰 데이터프레임을 행 수를 기준으로 잘라 로드하기

개요로드해서 처리하고자 하는 데이터 파일이 큰 경우, 메모리가 부족해지는 상황이 발생할 수도 있다. 이런 경우에는 테이터를 읽어오는 시점에서 전체 데이터가 아니라 데이터 조각을 읽어와 처리를 반복하는 것으로 문제 상황을 회피할 수 있다.이번 글에서는 read_csv를 사용할 때 작은 데이터프레임 단위로 읽는 방법을 적어둔다.  chunksizePandas는 csv 뿐만 아니라 여러 형식의 데이터를 로드할 수 있도록 read_json, read_table, read_fwf 등등의 함수를 제공하는데, chunksize라는 매개변수를 전달할 수 있다.chunksize는 한 번에 읽을 데이터프레임의 행 수를 지정한다. 기본값은 전체 데이터프레임을 로드하는 의미의 None인데, 값이 전달되면 데이터프레임이 아닌 ..

[Pandas] 데이터프레임 생성 시 ValueError: All arrays must be of the same length

현상다음과 같은 JSON 형식의 데이터가 있다고 하자.{ 'Singer' : 'James', 'Titles': ['a', 'b', 'c'], 'Albums' : [1, 2]}이 데이터를 1행 3열의 데이터프레임으로 생성하려고 한다. 하지만 기본적으로 리스트의 원소 수만큼의 행을 가진 데이터프레임을 만들게 끔 되어 있기 때문에 생성을 시도하면 다음과 같은 에러가 발생한다.ValueError: All arrays must be of the same length꼼수를 부려 데이터프레임을 만들어 보자.   방법데이터프레임을 생성할 때 DataFrame 생성자 말고 from_records, from_dicts과 같은 함수를 사용할 수도 있다. 이중 from_dicts 함수는 orient라는 매개변..

[Pandas] apply 시 컬럼의 값에 따라 다른 함수 사용하기

개요 Pandas에서 제공하는 apply 함수는 매개변수로 전달받은 함수를 적용하는 함수이다. 당연히 하나의 함수를 열이나 행에 적용하는데…… 각 데이터의 값에 따라 적용해야 하는 함수가 달라져야 하는 필요가 생겼다. 지금부터 다음의 문제 상황을 맞이했다고 해보자. 업무에서 처리되는 데이터는 S3에 다음과 같은 경로에 떨어진다. 's3://test-bucket/summary/titanic/class=First/date=2024-03-28/27b3ce6245b44ff0950e98419089e66c-0.parquet' 's3://test-bucket/summary/titanic/class=Second/date=2024-03-28/27b3ce6245b44ff0950e98419089e66c-0.parquet' ..

[Pandas] 데이터프레임의 다른 컬럼을 참조하여 문자열 치환

개요 기존에 처리해서 S3에 저장한 데이터를 새로 처리해 새로운 경로에 저장하고 있다. 예로 들어 기존 데이터가 저장된 S3 경로가 아래와 같다면, s3://test-bucket/summary/titanic/class=First/27b3ce6245b44ff0950e98419089e66c-0.parquet' s3://test-bucket/summary/titanic/class=Second/27b3ce6245b44ff0950e98419089e66c-0.parquet' s3://test-bucket/summary/titanic/class=Third/27b3ce6245b44ff0950e98419089e66c-0.parquet' s3://test-bucket/raw/iris/species=setosa/2770df..

[Pandas] NamedAgg - 그룹 연산 시 컬럼 이름 지정

개요 Pandas에서 DataFrame에 대해 groupby로 여러 컬럼에 여러 연산을 적용하면 멀티 인덱스 컬럼 형태의 결과를 반환받을 수 있다. df.groupby('a', dropna=False).agg([list, 'count', 'size']) Pandas 공식 문서 https://pandas.pydata.org/docs/user_guide/advanced.html를 보면 멀티 인덱스 컬럼을 사용한 인덱싱 방법을 상세하게 설명하고 있지만, 아무래도 다소 복잡한 것 같아 그룹 연산한 결과를 단일 인덱스 컬럼 형태로 반환받고 싶다. 방법을 적어둔다. named aggregation Pandas에서 agg 함수를 사용할 때 컬럼에 대한 연산 출력 이름을 제어할 수 있도록 named aggregatio..

[Pandas] 여러 컬럼에 대해 NaN을 포함하는 행 찾기

개요 DataFrame에서 특정 결측값을 포함하는 행을 찾을 때는 isnull, isna 함수 등을 사용하여 아래와 같이 필터링할 수 있다. df[df['a'].isnull()] df[df['a'].isna()] 여러 컬럼에서 결측값을 포함하는 행을 찾을 때는 OR 연산자를 이용할 수 있지만, 확인해야하는 컬럼이 많으면 코드가 지저분해진다. 한 줄로 찾을 수 있는 방법을 적어둔다. any / all 2022.10.08 - [Python] any/all - 여러 요소의 참/거짓 확인에서 확인했던 Python의 all, any 함수를 Pandas에서도 제공하고 있다. Pandas에서 all과 any 함수는 Series 또는 DataFrame 축을 따라 요소가 참인지 거짓인지를 판단한다. any 함수는 값이 ..

[Pandas] 데이터를 리스트로 그룹화

개요 데이터프레임에 대한 그룹 분석이 필요한데, 그룹 별 데이터 값 유지가 필요한 상황이다. 그래서 그룹 연산을 하면서 컬럼을 리스트 형태로 변환하려고 한다. 방법을 적어둔다. groupby.agg 2022.12.31 - [Python] Pandas - 피봇테이블과 그룹분석 2에서 살펴봤던 사용자 정의 함수로 그룹 분석을 수행하는 agg 함수를 활용하면 된다. df.groupby('a').agg(list) agg 함수에 list를 넘겨주면 아래와 같이 컬럼 별로 데이터가 리스트 형태로 변환되는 것을 확인할 수 있다. 다만 그룹화하는 기준인 a 컬럼에 결측값이 포함되어 있는데, groupby를 수행하면서 해당 데이터가 누락되는 것을 확인할 수 있다. 이런 경우에는 groupby 함수에 dropna 매개변수..

[Pandas] isin - 리스트로 필터링하기

개요 Pandas에서 데이터프레임에 대한 열 필터링을 할 때는 아래와 같은 코드를 사용한다. df[df['column'] == 'value'] 만약 조건이 되는 값이 여럿일 때는 OR 연산자를 사용할 수 있다. df[(df['column'] == 'value1')] | (df['column'] == 'value2')] 하지만 조건이 될 수 있는 값이 보다 많을 때는 OR 연산자를 사용하는 것보다 isin 함수를 사용하는 것이 좋을 것 같다. 사용 방법을 적어둔다. DataFrame.isin isin 함수는 DataFrame의 요소가 값에 포함되어 있는지를 판단한다. 값은 iterable, Series, Dictionary, DataFrame 등으로 지정할 수 있다. 예시 데이터 ) data = {"반" ..

[Pandas] 결측치를 None으로 치환

개요 Pandas로 데이터프레임을 처리하다 보면 아래와 같이 None과 NaN이 혼재되어 있는 경우가 있을 수 있다. 이때 결측치를 None으로 치환하는 방식으로 처리하려고 한다. 내용을 적어둔다. NaN과 None의 차이 먼저 결측치와 None은 다르다는 점을 이해해야 한다. NaN은 float 객체로 벡터화 연산을 허용하는 반면, None은 Python의 NoneType 객체로 벡터화 연산을 허용하지 않는다. print(f'type(None): {type(None)}') print(f'type(np.NaN): {type(np.NaN)}') 또한 NaN은 어떤 값과 비교해도 같지 않다고 판단하기 때문에 두 값을 비교 연산자로 확인해 보면 서로 같지 않다. print(np.NaN == None) # Fa..

1 2