본문 바로가기

Python/Pandas

ChatGPT로 Python pandas 알아보기 (4):DataFrame method

반응형

ChatGPT로 Python pandas 알아보기 (4):DataFrame method

이번 포스트에서는 ChatGPT로 Python pandas 라이브러리의 여러가지 method들에 대해서 알아보고자 한다.
필자도 pandas를 업무할 때 간간이 사용하는데, 이번에 이 포스트를 작성하면서 ChatGPT가 출력해 줘서 알게된 것도 있었다.
이번에는 모든 method를 정리해 보진 못했지만 추후에 다른 method와 property 들에 대해 정리해 봐야겠다.
그럼 pandas 라이브러리의 DataFrame의 method 몇 가지에 대해서 한번 알아보자.
우선 샘플 데이터로 사용할 데이터프레임은 이전 포스트에서 사용한 데이터프레임을 사용하겠다.
import pandas as pd
data = {
    '이름': ['철수', '영희', '민수', '수진', '호영'],
    '나이': [28, 24, 22, 32, 27],
    '성별': ['남', '여', '남', '여', '남'],
    '도시': ['서울', '대전', '부산', '광주', '서울']
}

df = pd.DataFrame(data)


isin()
isin() 메서드는 데이터프레임이나 시리즈의 요소가 주어진 값들 중 하나에 해당하는지 여부를 확인하는 데 사용된다.
이 메서드는 필터링을 수행할 때 유용하게 사용될 수 있다.
isin() 메서드는 리스트, 튜플, 또는 다른 반복 가능한(iterable) 객체를 인자로 받아, 데이터프레임이나 시리즈의 각 요소가 해당 값들 중 어느 하나와 일치하는지 불리언 값으로 반환한다.
# 기본 사용법
DataFrame.isin(values)
Series.isin(values)
# '도시' 컬럼에서 '서울' 또는 '부산'에 해당하는 데이터만 선택
cities = ['서울', '부산']
df[df['도시'].isin(cities)]
▶ 출력 결과
isin() 메서드는 데이터프레임 전체에도 적용할 수 있다.
이 경우, 각 요소가 지정된 값들 중 하나와 일치하는지 여부를 불리언 값으로 가진 데이터프레임을 반환한다.
values = {'이름': ['철수', '수진'], '나이': [28, 32]}
df.isin(values)
▶ 출력 결과


str.contains()
str.contains() 메서드는 pandas 데이터프레임의 문자열 컬럼에 대해, 특정 문자열이 포함되어 있는지 여부를 확인하는 데 사용된다.
이 메서드는 데이터프레임의 문자열 데이터를 필터링할 때 유용하게 사용될 수 있다.
str.contains() 메서드는 주로 데이터프레임의 특정 문자열 컬럼에 적용된다.
검색할 문자열 패턴을 인자로 전달하며, 각 문자열 값에 대해 해당 패턴이 포함되어 있는지 불리언 값으로 반환한다.
# 기본 사용법
DataFrame['컬럼'].str.contains('검색할_문자열', na=False, case=True, regex=True)
검색할_문자열 : 찾고자 하는 문자열 패턴.
na : 결측값이 있을 경우 반환할 값 (예: na=False).
case : 대소문자를 구분할지 여부 (기본값은 True로 대소문자를 구분).
regex : 정규 표현식을 사용할지 여부 (기본값은 True).
# '이름' 컬럼에 '수'가 포함된 데이터만 선택
contains_su = df[df['이름'].str.contains('수')]
▶ 출력 결과
✔ 정규 표현식 사용
regex 파라미터를 사용하여 정규 표현식으로 문자열 패턴을 검색할 수도 있다.
# 정규 표현식을 사용하여 이름이 '수'로 시작하는지 검사
df[df['이름'].str.contains('^수', na=False, regex=True)]
▶ 출력 결과


query()
query() 메서드는 데이터프레임에 대해 조건식을 문자열로 전달하여 해당 조건을 만족하는 행을 필터링하는데 사용된다.
query() 메서드는 복잡한 조건을 간단한 문자열 형태로 표현할 수 있어, 때로는 다른 필터링 방법보다 코드를 더 간결하게 만드는데 도움이 된다.
# 기본 사용법
DataFrame.query('조건식')
# 나이가 25세 이상이고, '서울' 또는 '부산'에 거주하는 데이터만 선택
df.query("나이 >= 25 and 도시 in ['서울', '부산']")
▶ 출력 결과
✔ 외부 변수 참조
query() 메서드 내에서 외부 변수를 참조하려면 @ 기호를 사용한다.
age_threshold = 25
df.query('나이 >= @age_threshold')
▶ 출력 결과
✔ 인덱스를 사용한 필터링
query() 메서드를 사용하여 인덱스를 기준으로 필터링을 수행할 수도 있다.
이 때 index 키워드를 사용합니다.
# 인덱스가 2 이상인 행 필터링
df.query("index >= 2")
▶ 출력 결과
✔ query 메서드의 주의사항
query() 메서드는 매우 강력하지만, 컬럼 이름에 공백이나 특수 문자가 포함된 경우 사용이 제한될 수 있다.
이때는 대괄호([])와 논리 연산자를 사용하여 필터링을 수행하는 것이 더 효율적일 수 있다.
또한, query() 메서드는 내부적으로 numexpr 라이브러리를 사용하여 계산을 수행하는데, 이는 일반적으로 매우 빠른 성능을 제공한다.
하지만 매우 큰 데이터셋에서는 메모리 사용량이 증가할 수 있으니 주의해야 한다.
[ 컬럼 이름에 공백이나 특수 문자가 있을 경우 ]
query() 메서드는 문자열 형태로 조건을 입력받기 때문에, 컬럼 이름에 공백이나 특수 문자가 포함되어 있으면 사용이 어려울 수 있다.
이럴 때는 역 따옴표(`)를 사용하여 컬럼 이름을 감싸야 한다.
df.query('`컬럼 이름` > 30')
[ 문자열 이스케이핑 ]
문자열 내에 따옴표가 포함되어 있을 경우 이스케이핑이 필요하다.
df.query('`도 시` == "\'서울\'"')


apply()
apply() 메서드는 데이터프레임이나 시리즈에 함수를 적용하는데 사용된다.
이를 통해 각 원소 또는 행, 열에 대해 원하는 연산을 수행할 수 있다.
# 기본 사용법
DataFrame.apply(함수, axis=0)
Series.apply(함수)
함수 : 적용할 함수를 지정한다. 람다 함수(lambda function)를 사용할 수도 있고, 일반 함수를 사용할 수도 있다.

axis: 데이터프레임에 대해 apply() 메서드를 사용할 때, 함수를 적용할 축을 지정한다.
axis=0이면 각 열에 함수가 적용되고, axis=1이면 각 행에 함수가 적용된다.
시리즈에 apply() 메서드를 사용하는 경우 이 매개변수는 사용되지 않는다.
# 예시: 나이가 30세 미만이고 이름에 '수'가 포함된 데이터 선택
def custom_filter(row):
    return row['나이'] < 30 and '수' in row['이름']

df[df.apply(custom_filter, axis=1)]
▶ 출력 결과
apply() 메서드는 데이터 처리에 있어 매우 유연하고 강력한 도구로, 복잡한 로직을 쉽게 적용할 수 있도록 해준다.
다만, apply() 메서드는 때때로 느린 실행 속도를 가질 수 있으므로, 대량의 데이터를 처리할 때는 성능을 고려해야 한다.


between()
between() 메서드는 pandas의 시리즈에서 특정 범위 내에 있는 값을 필터링하는데 사용된다.
이 메서드는 주어진 두 값 사이에 있는 모든 원소를 선택한다.
# 기본 사용법
Series.between(최소값, 최대값, inclusive=True)
최소값 : 선택할 값의 하한.
최대값 : 선택할 값의 상한.
inclusive : 기본값은 True로, 이 경우 최소값과 최대값을 포함하여 필터링한다. False로 설정하면, 최소값과 최대값을 제외한 값만 필터링한다.
# '나이' 컬럼에서 25세 이상 30세 이하인 데이터만 선택
age_filter = df[df['나이'].between(25, 30)]
▶ 출력 결과
between() 메서드는 특정 범위 내의 값을 선택하는데 매우 편리하고, 불린 마스크(Boolean mask)를 반환하기 때문에, 이를 데이터프레임에 바로 적용할 수 있다.


isnull() / notnull()
isnull()notnull() 메서드는 데이터프레임이나 시리즈의 원소가 null 값인지 아닌지를 확인하는 데 사용된다.

isnull() 메서드는 각 원소가 null 값(NaN 또는 None)인지 여부를 불린 값으로 반환한다. null 값이면 True, 아니면 False를 반환한다.

notnull() 메서드는 isnull()의 반대이다.
즉, 각 원소가 null 값이 아닌 경우에만 True를 반환하고, null 값인 경우에는 False를 반환한다.
# 기본 사용법
DataFrame.isnull()
DataFrame.notnull()

Series.isnull()
Series.notnull()
# '나이' 컬럼에서 결측치인 데이터만 선택
null_filter = df[df['나이'].isnull()]
▶ 출력 결과 (나이에 모든 값이 있기 때문에 isnull로는 결과가 없다.)
# '나이' 컬럼에서 결측치가 아닌 데이터만 선택
notnull_filter = df[df['나이'].notnull()]
▶ 출력 결과
이 두 메서드는 결측치(missing values)를 처리하는 데 매우 유용하다.
예를 들어, isnull()을 사용하여 결측치가 있는 행을 제거하거나, notnull()을 사용하여 결측치가 없는 행만 선택하는 등의 작업을 할 수 있다.
✔ 결측치 제거
# 결측치 제거 샘플 데이터
nan_data = {
    'A': [1, np.nan, 3, 4, 5],
    'B': [np.nan, 7, 8, None, 10],
    'C': [11, 12, 13, 14, 15]
}
nan_df = pd.DataFrame(nan_data)
▶ 출력 결과
이번 포스트에서는 pandas의 메서드 몇 가지에 대해서 알아보았다.
이 메서드들 말고도 다양한 메서드들이 있는데 이건 나중에 추가로 포스트 작성해야겠다.
필자의 경우 pandas를 유튜브 강의를 우연히 보고 나서부터, pandas를 업무에서 활용하곤 있었는데 여태 query라는 메서드는 몰랐다.
강의에서도 분명 나오지 않았던 거고...
근데 단순하게 ChatGPT에게 "pandas의 메서드 몇 가지 설명해 줘" 했더니 나온 건데, 이번에도 좋은 걸 배우게 되어 기쁘다.
확실히 ChatGPT로 빠르게, 간단하게 공부하는 것이 나에게는 잘 맞는 거 같고 많이 도움이 되는 것 같다.
반응형

loading