[Data Analysis] Pandas 라이브러리 연습

2025. 2. 25. 13:46·Data Analysis/Basic

1. Pandas 라이브러리란?

 

Pandas는 2009년에 오픈소스로 공개된 이후, 데이터 분석 및 가공을 위한 표준 라이브러리로 자리잡았음. 특히 데이터프레임을 활용하면 구조화된 데이터의 처리 및 변형이 용이해지며, 내부적으로 Cython(C++ 기반 최적화 코드)을 사용하여 빠른 속도를 제공함.

주요 활용 라이브러리:

  • 산술 계산: NumPy, SciPy 등
  • 데이터 분석: statsmodels, scikit-learn 등
  • 시각화: Matplotlib, Seaborn 등

Pandas는 Anaconda, Google Colab 등의 환경에서 기본적으로 설치되어 있으며, 필요 시 pip install pandas를 통해 추가 설치할 수 있음.

 

import pandas as pd

# Pandas 현재 버전 확인
print(pd.__version__)

2. Pandas 파일 입출력(I/O)

Pandas는 다양한 형식의 외부 데이터를 데이터프레임으로 쉽게 변환할 수 있는 강력한 I/O 기능을 제공함. 특히, JSON 파일을 다룰 때 유용함.

JSON 파일

Pandas의 read_json() 함수는 JSON 파일을 읽어와서 데이터프레임으로 변환하는 기능을 제공함. JSON 형식은 딕셔너리와 유사한 키-값 구조로 데이터를 저장하며, 계층적(중첩) 구조를 가질 수 있음.

주요 옵션:

  • orient: JSON 데이터의 형식을 지정함. 기본값은 records로 각 JSON 객체가 데이터프레임의 행(row)으로 변환됨.
  • lines=True: JSON Lines (NDJSON) 형식의 데이터를 처리할 때 사용함.
  • index_col: 특정 열을 데이터프레임의 인덱스로 지정할 수 있음.
# JSON 파일을 읽어와서 데이터프레임으로 변환 
df_json = pd.read_json('Magazine_Subscriptions.json', lines=True)

 

2.1. 데이터프레임 복사

Pandas에서는 copy() 함수를 사용하여 데이터프레임의 복사본을 만들 수 있음.

# 데이터프레임 복사본 생성
df = df_json.copy()
df

3. 데이터 탐색

3.1. 데이터의 일부만 확인: head(), tail()

  • head(): 데이터프레임의 처음 n개의 행을 반환함. 기본적으로 5개의 행을 반환하지만, n 값을 입력하면 반환 개수를 조정할 수 있음.
  • tail(): 데이터프레임의 마지막 n개의 행을 반환함.
# 처음 5개 행 출력
df.head()

# 마지막 10개 행 출력
df.tail(10)

 

 

3.2. 무작위 행 추출: sample()

  • frac: 전체 데이터 중 몇 퍼센트를 추출할지 지정함.
# 무작위로 10개 행을 추출
df.sample(n=10)

# 무작위로 전체 데이터의 20%를 추출
df.sample(frac=0.2)

 

3.3. 차원 확인: shape()

데이터프레임의 차원을 나타내는 튜플을 반환함. 튜플의 첫 번째 요소는 행의 개수, 두 번째 요소는 열의 개수를 나타냄.

# 데이터프레임의 차원 확인
df.shape

 

3.4. 요약 정보: info()

데이터프레임의 상세 정보를 출력함. 데이터의 열 이름, 데이터 타입, 결측값 등을 확인할 수 있음.

# 데이터프레임의 상세 정보 출력
df.info()

3.5. 기초통계: describe()

데이터프레임의 숫자형 열에 대해 주요 기술 통계 정보를 요약하여 제공함. 기본적으로 평균(mean), 표준편차(std), 최솟값(min), 최댓값(max), 사분위수(25%, 50%, 75%) 등의 통계를 출력함. include='all' 옵션을 사용하면 숫자형이 아닌 열에 대한 정보도 포함하여 출력할 수 있음.

# 데이터프레임의 기초 통계 정보 출력
df.describe()

# 숫자형이 아닌 데이터도 포함하여 통계 정보 출력
df.describe(include='all')

3.6 비결측값 개수 계산: count()

count() 함수는 데이터프레임의 각 열에 대해 비결측값(non-NA/null)의 개수를 계산하여 시리즈 객체로 반환합니다.

# 각 열의 유효한 데이터 개수 출력
df.count()

 

3.7 고유값 계산: nunique()

nunique()는 데이터프레임이나 시리즈에서 고유값의 개수를 반환합니다.

# 'overall' 열의 고유값 개수
df['overall'].nunique()

3.8 고유값 빈도 계산: value_counts()

value_counts()는 각 고유값이 데이터 내에서 몇 번 나타나는지 계산합니다. 기본적으로 내림차순으로 정렬되어 반환됩니다.

# 'overall' 열의 고유값 빈도 계산
df["overall"].value_counts()

4. 행 서브셋 선택

4.1 조건에 맞는 행 선택: 조건식

조건식을 사용해 특정 조건을 만족하는 행을 선택할 수 있습니다.

# 평점이 3보다 큰 행 선택
df[df['overall'] > 3]

# 'vote' 열을 정수형으로 변환
df['vote'] = pd.to_numeric(df['vote'], errors='coerce')

# 평점이 3보다 크고 'vote' 열이 10개 이상인 행 선택
df[(df['overall'] > 3) & (df['vote'] > 10)]

 

여기서 df[(df['overall'] > 3) & (df['vote'] > 10)] 먼저 실행하면 'vote'열이 문자열로 되어있어 오류가 나기 때문에

 

'vote' 열을 정수형으로 변환해주고 실행하면 정상적으로 실행된다.  df['vote'] = pd.to_numeric(df['vote'], errors='coerce')

4.2 조건에 맞는 행 선택: query()

query() 함수는 문자열 조건식을 사용해 데이터를 필터링할 수 있습니다.

# 평점이 3보다 큰 행 선택
df.query('overall > 3')

# 평점이 3보다 크고 vote 컬럼이 10개 이상인 행 선택
df.query('overall > 3 and vote > 10')

# reviewText 컬럼에 'good' 텍스트가 포함된 행만 선택
df.query('reviewText.str.contains("good", case=False, na=False)', engine='python')

 

4.3 조건에 맞는 행 선택: isin()

isin() 함수는 특정 열에서 주어진 값이 포함된 행을 선택합니다.

# 'overall' 열 값이 5 또는 4인 행 출력
df[df['overall'].isin([4, 5])]

4.4 중복 행 제거: drop_duplicates()

중복된 데이터를 제거할 때 drop_duplicates()를 사용합니다.

# 'reviewText' 컬럼 기준으로 중복 행 제거
df.drop_duplicates(subset='reviewText')

5. 특정 열 선택

5.1 단일 열 선택

단일 열을 선택할 때는 아래와 같이 두 가지 방법을 사용할 수 있습니다.

# 'reviewText' 열 선택
df['reviewText']

# 'reviewText' 열 선택 (점 표기법 사용)
df.reviewText

 

5.2 여러 컬럼 선택

여러 개의 열을 선택하려면 열 이름을 리스트로 전달합니다.

# 'reviewText', 'overall', 'vote' 열 선택
df[['reviewText', 'overall', 'vote']]

 

5.3 filter() 함수와 정규 표현식

filter() 함수를 사용하여 특정 패턴과 일치하는 열을 선택할 수 있습니다.

# 'Time'가 포함된 열을 선택
df.filter(like='Time')

# 'review'가 포함된 모든 열을 선택
df.filter(regex='review', axis=1)

# 'r'로 시작하는 열 선택
df.filter(regex='^r')

# 'e'로 끝나는 열 선택
df.filter(regex='e$')

6. 데이터 변형 (Reshaping)

6.1 데이터프레임 병합: concat()

concat() 함수는 데이터프레임을 병합할 때 사용합니다.

# 기존 데이터프레임 생성
data1 = {'Name': ['Chulsoo', 'Younghee', 'Minsu', 'Jiyoung'], 'Age': [25, 30, 22, 28]}
df1 = pd.DataFrame(data1)

# 추가할 데이터프레임 생성
data2 = {'Name': ['Hyunwoo', 'Suji', 'Donghyun', 'Jisoo'], 'Age': [24, 27, 26, 29]}
df2 = pd.DataFrame(data2)

# 데이터프레임 병합 (row-wise 결합)
df_merged = pd.concat([df1, df2])

# 인덱스 재설정
df_merged_reset = df_merged.reset_index(drop=True)

print(df_merged)
print(df_merged_reset)

 

# df1 데이터프레임 생성
data1 = {
    'Name': ['Chulsoo', 'Younghee', 'Minsu', 'Jiyoung'],
    'Age': [25, 30, 22, 28]
}
df1 = pd.DataFrame(data1)  

# df2 데이터프레임 생성

data2 = {
    'City': ['Seoul', 'Busan', 'Incheon', 'Daegu'],
    'Country': ['Korea', 'Korea', 'Korea', 'Korea']
}
df2 = pd.DataFrame(data2) 

# 데이터프레임 병합 (column-wise 결합)
df_merged_columns = pd.concat([df1, df2], axis=1)  # df1과 df2를 컬럼 기준으로 병합 가능

print("병합된 데이터프레임:")
print(df_merged_columns)

 

6.2 특정 열 기준 행 정렬: sort_values()

sort_values()는 특정 열을 기준으로 데이터프레임의 행을 정렬합니다.

    * ascending=True (기본값): 작은 값에서 큰 값으로 정렬
    * ascending=False: 큰 값에서 작은 값으로 정렬

 

6.3 열 이름 수정: rename()

열 이름을 변경할 때 rename()을 사용합니다.

# 'reviewText' 열을 'review'로, 'reviewerName' 열을 'name'으로 변경
df.rename(columns={'reviewText': 'review', 'reviewerName': 'name'})

 

6.4 인덱스 정렬: sort_index()

sort_index()는 데이터프레임의 인덱스를 기준으로 정렬합니다.

# 인덱스를 기준으로 오름차순 정렬
df.sort_index()

# 인덱스를 기준으로 내림차순 정렬
df.sort_index(ascending=False)

 

6.5 열 삭제: drop()

특정 열을 삭제할 때 drop()을 사용합니다.

# 'reviewText'와 'summary' 열을 삭제
df.drop(columns=['reviewText', 'summary'])

7. 파생변수

apply()와 lambda를 사용하여 각 값에 조건에 따라 다른 값을 부여하는 파생변수를 생성할 수 있습니다.

# 'overall' 열의 각 값에 대해 3 이상이면 'Pos' 아니면 'Neg'를 저장
df['overall'].apply(lambda x: 'Pos' if x >= 3 else 'Neg')

 

8. 누락 데이터 처리

8.1 누락 데이터 확인

# 데이터프레임 요약 정보 출력
df.info()

# 특정 열의 데이터 개수 확인 (누락 데이터 포함)
print(df['vote'].value_counts(dropna=False))

# 열별 누락 데이터 개수 확인
print(df.isnull().sum())

 

8.2 누락 데이터 제거

누락 데이터를 제거하는 방법입니다.

* NaN이 포함된 행 또는 열을 삭제할 때 dropna() 함수를 사용
    * axis=0 (기본값): NaN이 포함된 행 삭제
    * axis=1: NaN이 포함된 열 삭제
# NaN이 포함된 행 삭제
df.dropna()

# NaN이 포함된 열 삭제
df.dropna(axis=1)

# 'image' 열에서 NaN이 포함된 행 제거
df.dropna(subset=['image'])

 

8.3 누락 데이터 대체법(imputation)

* 데이터 크기가 크고 누락된 값이 적다면 데이터를 삭제해도 분석 결과에 큰 영향을 미치지 않지만, 데이터 크기가 작으면 누락 데이터 삭제로 인해 결과가 왜곡될 가능성이 높음
    * 누락 데이터를 대체하면 데이터 손실을 방지하고 분석 결과가 왜곡되는 문제를 보완할 수 있음
    * 대표값(평균, 최빈값 등)을 사용하여 모든 누락 데이터를 대체하는 방법이 있으며, 보다 정교한 방식으로 통계적 기법
 
(회귀 분석, KNN 대체법 등)을 이용하여 값을 추정해 대체하는 방법도 있음
# 'vote' 열의 평균으로 결측값 대체
df['vote'].fillna(df['vote'].mean().round(0))

# 최빈값으로 결측값 대체
mode_value = df['vote'].mode()[0]  # 최빈값 계산
df['vote'].fillna(mode_value)
* 평균(mean)으로 결측값 대체

* 최빈값(mode)으로 결측값 대체

9. merge() 함수

merge()는 데이터프레임을 기준 열을 기준으로 병합할 때 사용됩니다.

    * on: 병합의 기준이 되는 열 이름을 의미함 → None이 기본값이며 이 경우 두 데이터프레임에 공통으로 존재하는 모든 열을 기준으로 병합을 시도함
 
    * how: 병합 방식을 의미하며 'inner'가 기본값을 의미함 → 이는 두 데이터프레임의 기준 열에서 교집합을 찾아 해당하는 행만을 병합함
 

 

9.1 Inner Join

기준 열의 교집합에 해당하는 행만을 병합합니다.

# 데이터프레임 병합: on=None, how='inner'
pd.merge(df1, df2, on='id', how='inner')

9.2 Outer Join

 

기준 열을 기준으로 두 데이터프레임의 합집합을 생성합니다.

# 데이터프레임 병합: on='key', how='outer'
pd.merge(df1, df2, on='id', how='outer')

9.4 Left Join / Right Join

왼쪽 또는 오른쪽 데이터프레임을 기준으로 병합할 때 사용합니다.

# how='right' 옵션을 사용하여 오른쪽 데이터프레임을 기준으로 병합
pd.merge(df1, df2, left_on='id1', right_on='id2', how='right')

# how='left'을 사용하여 왼쪽 데이터프레임을 기준으로 병합
pd.merge(df1, df2, left_on='id1', right_on='id2', how='left')

10. 그룹 연산

* 그룹 연산의 3단계 과정
    * Split (분할): 데이터를 특정 기준(하나 이상의 열)에 따라 여러 그룹으로 분할 → 분석하고자 하는 열에 따라 데이터프레임이 여러 서브셋으로 분할
    * Apply (적용): 각 그룹에 대해 집계, 변환, 필터링과 같은 연산을 수행 → 각 그룹별로 요약 통계를 계산하거나, 그룹별로 특정 연산을 적용하는 과정을 포함
    * Combine (결합): 2단계에서의 연산 결과를 하나의 데이터 구조로 결합 → 모든 그룹 연산의 결과를 합쳐서 최종적인 결과를 제공
# 예제 데이터프레임 생성
data = {
    'State': ['CA', 'CA', 'TX', 'TX', 'NY', 'NY', 'CA', 'TX', 'NY'],
    'Gender': ['F', 'M', 'F', 'M', 'F', 'M', 'F', 'M', 'F'],
    'Year': [2020, 2020, 2020, 2020, 2021, 2021, 2019, 2021, 2019],
    'Name': ['Emma', 'Liam', 'Olivia', 'Noah', 'Ava', 'Ethan', 'Sophia', 'Mason', 'Isabella'],
    'Count': [300, 250, 400, 350, 200, 150, 320, 340, 230]
}

df = pd.DataFrame(data)

 

10.1 Split (분할)

groupby()를 사용하여 데이터를 특정 열을 기준으로 그룹화

# 'Year' 열을 기준으로 그룹화
grouped = df.groupby('Year')

# 각 평점별 그룹 정보 출력
for key, group in grouped:
    print("-" * 20)
    print(f"Asin: {key}")
    print(f"Count: {len(group)}")
    
# 'Year' 열을 기준으로 그룹화
grouped = df.groupby('Year')
    
# 'Year' 값이 2020인 데이터 그룹 선택
group_a1 = grouped.get_group(2020)
print(group_a1)

 

10.2 Apply (적용) / Combine (결합)

그룹별로 연산을 적용하고 결과를 결합합니다.

* Pandas의 groupby() 함수를 사용해 생성된 그룹 객체에 대하여 다양한 집계(aggregation) 연산을 적용 가능 (예: 평균, 최대값, 최소값, 합계 등)을 계산
# 각 그룹별 표준편차 계산
std_dev = grouped['Count'].std()
print(std_dev)

# 각 그룹별 요약 통계량 출력
desc = grouped['Count'].describe()
print(desc)

* [중요] 집계 함수의 활용
    * mean(): 평균값
    * max(): 최대값
    * min(): 최소값
    * sum(): 합계
    * count(): 개수 (NaN이 아닌 값의 개수)
    * size(): 그룹의 크기 (NaN 값을 포함)
    * var(): 분산
    * std(): 표준편차
    * describe(): 요약 통계량
    * first(), last(): 각 그룹의 첫 번째와 마지막 값

 

10.3 agg() 함수

agg()는 여러 개의 집계 함수 한 번에 적용할 때 유용합니다.

# 'Year' 열을 기준으로 그룹화
grouped = df.groupby('Year')

# 각 그룹별로 여러 집계 함수 적용
result = grouped["Count"].agg(['sum', 'mean', 'std'])
print(result)

# 열마다 다른 집계 함수 적용
result_diff = grouped.agg({'Gender': 'size', 'Count': ['mean', 'std']})

print(result_diff)

 

 

10.4 transform() 함수

 

transform()은 각 원소에 대해 연산을 수행한 후 그 결과를 원래 데이터프레임의 구조에 맞추어 반환

 

transform() 함수의 주요 특징

 

  • 그룹별로 함수를 적용: transform()은 데이터를 그룹화한 후, 각 그룹에 대해 주어진 함수를 적용합니다.
  • 원본 데이터프레임과 동일한 형태 반환: 그룹별로 함수가 적용된 결과는 원본 데이터프레임과 동일한 길이와 형태를 유지하며 반환됩니다. 즉, 그룹별 결과를 원본 데이터에 맞게 확장하여 반환합니다.
  • 각 행에 계산된 결과 반영: 반환된 결과는 각 행에 대한 계산된 값이 그대로 반영됩니다. 예를 들어, 그룹별 평균값을 계산한 후 이를 각 행에 적용할 수 있습니다.
  • 주로 그룹별 계산값을 원본 데이터에 적용: 주로 그룹별로 계산된 값(예: 평균, 최대값)을 원본 데이터의 각 행에 적용해야 할 때 사용됩니다.

 

# 'Year' 열을 기준으로 평균 계산
df.groupby('Year')["Count"].transform('mean')

10.5 filter() 함수

filter() 함수는 특정 조건을 만족하는 그룹을 필터링합니다.

 

2025.03.20 - [Data Analysis/Basic] - [Data Analysis] Pandas 라이브러리 연습 2

 

[Data Analysis] Pandas 라이브러리 연습 2

pd.to_numeric(arg, errors='raise')  Pandas에서 문자열이나 기타 형식의 데이터를 숫자로 변환할 때 사용하는 함수 * `arg`: 숫자로 변환할 대상 (Series, list-like 등)* `errors`: 변환 중 오류 발생 시 처리 방법

c0mputermaster.tistory.com

 

'Data Analysis > Basic' 카테고리의 다른 글

[Data Analysis] 데이터 전처리 해보기  (0) 2025.03.29
[Data Analysis] 데이터 시각화 해보기  (0) 2025.03.23
[Data Analysis] 데이터 정제 및 분석 해보기  (0) 2025.03.23
[Data Analysis] Pandas 라이브러리 연습 2  (0) 2025.03.20
[Data Analysis] 데이터 분석 프로세스 알아보기  (0) 2025.02.19
'Data Analysis/Basic' 카테고리의 다른 글
  • [Data Analysis] 데이터 시각화 해보기
  • [Data Analysis] 데이터 정제 및 분석 해보기
  • [Data Analysis] Pandas 라이브러리 연습 2
  • [Data Analysis] 데이터 분석 프로세스 알아보기
임승택
임승택
"Hello, I am Lim Seungtaek, a computer engineering student. Nice to meet you!"
  • Lim's Technology
    임승택
    임승택
    "Welcome to Lim's Technology!"
  • 누적 조회수
    총 회
    구독하기
    • 분류 전체보기 (102)
      • Blog (10)
      • Computer Vision (44)
        • Computer Vision (4)
        • Paper reviews (24)
        • Project (8)
        • Basic (8)
      • LLM (8)
        • Paper reviews (3)
        • Project (3)
        • Basic (2)
      • Data Analysis (11)
        • Basic (8)
        • Project (3)
      • Computer Graphics (2)
        • Basic (2)
      • Robotics (5)
        • Paper reviews (3)
        • Basic (2)
      • Technology Notes (15)
      • Memo (5)
  • 인기 글

  • 최근 댓글

  • 최근 글

임승택
[Data Analysis] Pandas 라이브러리 연습
상단으로

티스토리툴바