Python/NumPy | Pandas 66

[Pandas] update - 다른 데이터프레임 값으로 수정

개요 두 개의 다른 데이터프레임이 있을 때, 한 데이터프레임의 컬럼의 데이터프레임의 컬럼 값으로 수정하고 싶다. 확인해 보니 Pandas에서 제공하는 update 함수를 이용할 수 있는 것 같다. 사용 방법을 적어둔다. DataFrame.update update는 데이터프레임의 컬럼을 다른 DataFrame의 컬럼으로 덮어씌운다. 단 결측치가 아닌 값만 사용하며. 반환값 없이 원본이 변경된다. 인덱스와 컬럼이 동일한 셀의 값으로 데이터프레임을 수정하기 때문에, 두 데이터프레임 간에는 같은 이름의 인덱스와 컬럼이 존재해야 한다. 만약 시리즈를 사용한다면 name 속성을 사용해 컬럼 이름을 동일하게 맞추어야 한다. DataFrame.update(other, join='left', overwrite=True,..

[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] AWS S3에서의 parquet 파일 다루기

개요 2024.03.18 - [Pandas] parquet 파일 읽고 쓰기에서 일반 로컬 파일 시스템에서 parquet 파일을 읽거나 써보았다. 근데 공식 문서를 확인해 보면 read_parquet, to_parquet 함수 호출 시 storage_options 매개변수를 통해 AWS S3 등의 외부 저장소를 사용할 수 있는 것 같다. 이번 글에서는 Pandas를 사용해 AWS S3에 저장된 parquet 데이터를 읽거나 쓰는 방법에 대해 정리한다. 필요 라이브러리 설치 fsspec은 로컬, 원격, 임베디드 파일 시스템, 그리고 바이트 스토리지와 연동하는 인터페이스를 제공하는 라이브러리다. 그리고 s3fs는 s3 관련 python 파일 시스템 인터페이스를 제공한다. Pandas에서 두 패키지 모두 AWS..

[Pandas] parquet 파일 읽고 쓰기

개요 2024.03.13 - [Apache Arrow] parquet 파일 읽고 쓰기, 2024.03.14 - [Arrow] 파티셔닝한 parquet 파일 저장하기에서 Apache Arrow를 이용해 parquet 데이터를 읽고 쓰는 방법을 적어두었었는데, Pandas를 통해서 parquet 데이터를 읽고 쓸 수도 있다. 이 글에서는 Pandas를 이용한 방법을 적어둔다. read_parquet read_parquet 함수는 경로에 저장된 parquet 파일을 읽은 DataFrame을 반환한다. import pandas as pd pd.read_parquet('iris.parquet') 단일 파일 하나만 전달하거나, 여러 파일이 파티셔닝되어 저장된 경로를 전달해도 된다. 가령 iris란 경로에 parqu..

[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..