본문으로 건너뛰기

Python pandas 튜토리얼: 초보자를 위한 궁극 가이드

설치부터 분석까지 pandas를 학습하세요. 모든 예제는 pandas 3.1에서 테스트되었습니다.
· 15분 읽기

AI와 탐험해 보세요

pandas는 데이터 분석을 위한 표준 Python 패키지로, 매달 PyPI에서 5억 회 이상 다운로드됩니다. CSV, Excel, JSON, SQL 등 다양한 형식을 읽고 쓸 수 있으며, 표 형태 데이터의 정리, 재구조화, 집계, 시각화 같은 일상적인 작업을 폭넓게 지원합니다.

이 pandas 튜토리얼에서는 하나의 실제 데이터셋으로 전체 워크플로를 차근히 안내합니다. pandas 설치, 데이터 가져오기/내보내기, DataFrame 살펴보기, 행 선택과 필터링, 결측치와 중복 처리, 테이블 결합, 집계, 시각화까지 다룹니다. 모든 예제는 현재 릴리스인 pandas 3.1에서 실행되며, 예전 튜토리얼의 코드를 깨뜨리는 pandas 3 변경 사항은 따로 표시합니다.

필요한 것은 기본적인 Python 지식뿐이며, pandas 선행 경험은 없어도 됩니다. 보다 긴 학습 계획은 pandas 학습 방법 게시글을, 상호작용형 실습은 Data Manipulation with pandas 강좌를 참고하세요.

요약

  • pandas는 DataFrame으로 표 형태 데이터를 다루는 Python의 표준 라이브러리입니다.
  • pip install pandas로 설치하세요. pandas 3은 Python 3.11 이상이 필요합니다.
  • 핵심 워크플로: 읽기, 확인, 선택, 정리, 결합, 집계, 시각화, 내보내기.
  • .loc[]는 라벨로, .iloc[]는 위치로 선택합니다.
  • pandas 3부터 체이닝 할당은 데이터를 절대 갱신하지 않습니다. 한 번의 .loc[] 호출을 사용하세요.
  • 더는 권장되지 않는 inplace=True 대신 결과를 재할당하세요(df = df.dropna()).

pandas란?

pandas는 Python에서 표 형태 데이터를 다루는 데이터 조작 패키지입니다. 즉, 행과 열(즉 DataFrame)로 표현되는 데이터입니다. 직관적으로 DataFrame을 Excel 시트처럼 생각할 수 있습니다. 

pandas 기능에는 행 정렬과 부분집합 추출 같은 변환부터, 평균 같은 요약 통계 계산, DataFrame 재구조화, DataFrame 결합까지 포함됩니다. pandas는 흔히 PyData 생태계라 부르는 다른 인기 Python 데이터 과학 패키지와도 잘 맞물려 작동합니다. 예를 들어

pandas는 어디에 쓰이나요?

pandas는 데이터 분석 워크플로 전반에서 사용됩니다. pandas로 다음을 수행할 수 있습니다:

  • 데이터베이스, 스프레드시트, CSV 파일 등에서 데이터셋을 가져옵니다.
  • 예를 들어 결측치를 처리해 데이터셋을 정리합니다.
  • 분석에 알맞은 형식으로 구조를 재정리해 데이터를 정돈합니다.
  • 열 평균, 상관관계 등 요약 통계를 계산해 데이터를 집계합니다.
  • 데이터셋을 시각화해 인사이트를 도출합니다.

또한 시계열 분석과 텍스트 데이터 분석을 위한 기능도 포함되어 있습니다.

pandas의 핵심 장점

pandas는 일상적인 데이터 작업에 실용적인 다섯 가지 장점이 있습니다:

  • Python에 최적화: Python은 데이터 과학과 머신 러닝에서 가장 인기 있는 언어이므로, pandas는 이미 사용하는 도구와 잘 맞습니다.
  • 작업당 코드가 적음: 테이블 필터링, 그룹화, 조인은 루프 대신 한 줄이면 됩니다.
  • 읽기 쉬운 데이터 표시: DataFrame은 라벨이 붙은 표로 출력되므로 각 단계의 결과를 확인하기 쉽습니다.
  • 폭넓은 기능: 탐색적 분석, 결측치 처리, 요약 통계, 재구조화, 시계열, 시각화를 모두 다룹니다.
  • 수백만 행 처리: 메모리에만 맞으면 수백만 행, 수백 열도 다룹니다. 더 큰 데이터에는 Polars나 PySpark 같은 도구가 더 적합합니다.

pandas 설치 방법

pandas를 사용하려면 먼저 설치해야 합니다. 이 단계를 건너뛰려면 무료 DataCamp 계정을 등록하고, 상위 Python 데이터 과학 패키지와 함께 pandas가 사전 설치된 클라우드 IDE DataLab을 사용하세요.

pandas 설치

터미널에서 pip install 명령으로 pandas를 설치하세요. pandas 3은 Python 3.11 이상이 필요합니다. 더 낮은 버전의 Python에서는 pip이 해당 Python이 지원하는 최신 2.x 릴리스를 설치합니다.

pip install pandas

또는 conda로 설치할 수도 있습니다:

conda install pandas

설치 후에는 버전을 확인해 모든 것이 정상 동작하는지 점검하는 것이 좋습니다:

import pandas as pd
print(pd.__version__)  # Prints the pandas version

이로써 pandas가 제대로 설치되었는지 확인하고, 다른 패키지와의 호환성도 점검할 수 있습니다.

pandas 3.0과 3.1의 변경 사항

2026년 1월 출시된 pandas 3.0은 복사, 문자열, 할당 방식을 변경했으며, pandas 3.1(2026년 10월)은 대부분의 inplace=True 사용을 더는 권장하지 않습니다. 예전 튜토리얼의 코드는 대부분 여전히 동작하지만, 네 가지 변경이 자주 발목을 잡습니다:

  • Copy-on-Write가 기본값입니다. 모든 부분집합과 메서드 결과가 복사처럼 동작하므로 이를 변경해도 원본 DataFrame은 바뀌지 않습니다. SettingWithCopyWarning은 사라졌고, 방어적인 .copy() 호출도 필요 없습니다.
  • 체이닝 할당이 더는 동작하지 않습니다. df["Age"][0] = 35는 임시 복사본을 갱신할 뿐 df는 바뀌지 않으며, pandas는 ChainedAssignmentError로 경고합니다. 대신 하나의 .loc[] 호출을 사용하세요.
  • 문자열은 자체 데이터 타입을 가집니다. 텍스트 열은 이제 object가 아니라 str로 추론되며, PyArrow가 설치된 경우 이를 기반으로 합니다.
  • inplace=True가 더는 권장되지 않습니다. sort_values(), reset_index(), dropna(), drop_duplicates(), rename() 등 여러 메서드에 해당합니다. 대신 결과를 재할당하세요: df = df.dropna().

pandas 3 changed four defaults that break older tutorials

아래는 작은 DataFrame에서 체이닝 할당 변경을 보여줍니다:

import pandas as pd

patients = pd.DataFrame({"name": ["Ana", "Ben", "Chloe"], "age": [34, 51, 28]})

patients["age"][0] = 35      # chained assignment: patients is not changed
patients.loc[0, "age"] = 35  # a single .loc[] call: patients is updated
print(patients.dtypes)
name      str
age     int64
dtype: object

이 튜토리얼의 모든 예제는 pandas 3 규칙을 따릅니다. 전체 변경 목록은 pandas 3.0과 pandas 3.1의 공식 릴리스 노트를 참고하세요. 예전 코드를 유지보수한다면, Copy-on-Write가 대체한 동작을 설명하는 SettingWithCopyWarning 가이드를 확인하세요.

pandas에서 데이터 가져오기

pandas로 작업을 시작하려면 아래처럼 pandas 패키지를 임포트하세요. pandas를 임포트할 때 가장 흔한 별칭은 pd입니다.

import pandas as pd

CSV 파일 가져오기

쉼표로 구분된 값 파일을 읽으려면 파일 경로와 함께 read_csv()를 사용하세요(read_csv()로 데이터 불러오기 튜토리얼에서 더 자세히 다룹니다).

df = pd.read_csv("diabetes.csv")

이 읽기 작업은 diabetes.csv 파일을 pandas DataFrame인 df로 로드합니다. 본 튜토리얼에서는 Pima Indians Diabetes 데이터셋을 사용합니다. 768명의 환자, Glucose, BMI, Age 등 8개의 건강 지표, 그리고 당뇨 진단을 나타내는 Outcome 열(1은 진단됨)을 포함합니다.

텍스트 파일 가져오기

텍스트 파일 읽기도 CSV와 유사합니다. 차이점은 아래처럼 sep 인수로 구분자를 지정해야 한다는 것입니다. 구분자는 각 줄에서 값을(열을) 구분하는 문자입니다. 쉼표(sep=","), 탭(sep="\t"), 콜론(sep=":"), 공백(sep=r"\s+")이 가장 흔합니다. r"\s+"는 하나 이상의 공백 문자를 매칭하는 정규식이며, r 접두사는 원시 문자열을 의미해 Python이 \s를 잘못된 이스케이프로 처리하지 않게 합니다.

df = pd.read_csv("diabetes.txt", sep=r"\s+")

Excel 파일 가져오기(단일 시트)

read_excel() 함수로 파일 경로를 입력해 Excel 파일을 읽습니다. pandas가 Excel을 처리하려면 추가 엔진 패키지가 필요합니다: .xlsx는 openpyxl, 레거시 .xls는 xlrd를 설치하세요.

df = pd.read_excel('diabetes.xlsx')

header처럼 다른 인수도 지정할 수 있습니다. header는 어떤 행을 DataFrame의 헤더로 사용할지 지정하며 기본값은 0(첫 행을 열 이름으로 사용)입니다. names 인수에 리스트로 열 이름을 지정할 수도 있습니다. index_col(기본값 None)은 파일에 행 인덱스가 있을 때 사용합니다.

참고: pandas DataFrame이나 Series에서 인덱스는 DataFrame의 행 또는 열 위치를 가리키는 식별자입니다. 요약하면, 인덱스는 DataFrame의 행/열에 라벨을 붙여 해당 인덱스로 특정 행이나 열에 접근할 수 있게 합니다(아래에서 확인합니다). DataFrame의 행 인덱스는 범위(예: 0~303), 시계열(날짜/타임스탬프), 고유 식별자(예: employee_ID가 있는 employees 테이블) 등일 수 있습니다. 열의 경우 보통 열 이름을 나타내는 문자열입니다.

Excel 파일 가져오기(복수 시트)

여러 시트가 있는 Excel 파일 읽기도 크게 다르지 않습니다. sheet_name 인수를 추가로 지정하면 됩니다. 시트 이름은 문자열로, 시트 위치는 정수로 전달할 수 있습니다(파이썬은 0부터 시작하는 인덱싱을 사용하므로 첫 번째 시트는 sheet_name = 0으로 접근합니다).

# Python은 0부터 인덱싱하므로 두 번째 시트를 추출
df = pd.read_excel('diabetes_multi.xlsx', sheet_name=1)

JSON 파일 가져오기

read_csv()와 유사하게, JSON 파일은 read_json()을 사용해 파일 이름을 인수로 전달하면 됩니다(자세한 내용은 pandas로 JSON과 HTML 데이터 가져오기 튜토리얼을 참고). 아래 코드는 디스크의 JSON 파일을 읽어 DataFrame 객체 df를 만듭니다.

df = pd.read_json("diabetes.json")

pandas로 데이터 가져오기에 대해 더 알고 싶다면, Python으로 다양한 파일 형식을 가져오는 치트시트를 확인하세요. 

SQL 데이터베이스에서 데이터 가져오기

관계형 데이터베이스에서 데이터를 로드하려면 데이터베이스 커넥션과 함께 pd.read_sql()을 사용하세요.

import sqlite3

# SQLite 데이터베이스에 연결 생성
conn = sqlite3.connect("my_database.db")

# 테이블에서 데이터 읽기
df = pd.read_sql("SELECT * FROM my_table", conn)

PostgreSQL이나 MySQL 같은 다른 데이터베이스는 sqlite3 커넥션 대신 SQLAlchemy 엔진을 커넥션으로 전달하세요. 큰 테이블은 chunksize 인수로 배치 단위로 읽을 수 있습니다.

API에서 데이터 가져오기(JSON 형식)

데이터가 웹 API에서 온다면, pd.read_json()으로 바로 읽을 수 있습니다:

df = pd.read_json("https://api.example.com/data.json")

API 응답이 중첩 JSON이라면, pd.json_normalize()로 평탄화하여 중첩 키를 점으로 구분한 열로 바꿀 수 있습니다:

records = [
    {"id": 1, "vitals": {"glucose": 148, "bmi": 33.6}},
    {"id": 2, "vitals": {"glucose": 85, "bmi": 26.6}},
]
pd.json_normalize(records)
   id  vitals.glucose  vitals.bmi
0   1             148        33.6
1   2              85        26.6

pandas에서 데이터 내보내기

pandas는 다양한 파일 형식에서 데이터를 가져올 수 있을 뿐 아니라, 여러 포맷으로 데이터를 내보낼 수도 있습니다. 특히 pandas로 데이터를 변환한 뒤 로컬에 저장해야 할 때 자주 사용합니다. 아래는 pandas DataFrame을 여러 형식으로 출력하는 방법입니다.

DataFrame을 CSV 파일로 내보내기

pandas DataFrame(df 사용)은 .to_csv() 메서드로 CSV 파일로 저장합니다. 파일 경로를 전달하고, 파일에 행 인덱스가 필요하지 않다면 index=False를 설정하세요(기본값 index=True는 이름 없는 추가 열로 인덱스를 씁니다). DataFrame을 CSV로 저장하기 튜토리얼에서 다른 인수도 다룹니다.

df.to_csv("diabetes_out.csv", index=False)

DataFrame을 JSON 파일로 내보내기

.to_json() 메서드를 호출해 DataFrame 객체를 JSON 파일로 내보냅니다.

df.to_json("diabetes_out.json")

참고: JSON 파일은 DataFrame 같은 표 객체를 키-값 쌍으로 저장합니다. 따라서 JSON 파일에는 열 헤더가 반복되어 나타납니다.

DataFrame을 텍스트 파일로 내보내기

DataFrame을 CSV로 쓰는 것과 마찬가지로 .to_csv()를 호출할 수 있습니다. 차이점은 출력 파일 형식이 .txt이고, sep 인수로 구분자를 지정해야 한다는 점입니다.

df.to_csv('diabetes_out.txt', header=df.columns, index=None, sep=' ')

DataFrame을 Excel 파일로 내보내기

DataFrame에서 .to_excel()을 호출해 .xlsx 파일로 저장하세요(openpyxl이 필요). pandas는 레거시 .xls 파일 쓰기를 더 이상 지원하지 않습니다.

df.to_excel("diabetes_out.xlsx", index=False)

pandas에서 DataFrame 살펴보고 이해하기

표 형태 데이터를 DataFrame으로 읽었다면, 데이터를 훑어볼 필요가 있습니다. 데이터셋 일부를 보거나 요약 통계 형태의 개요를 확인할 수 있습니다.

데이터를 .head()와 .tail()로 확인하기

DataFrame의 처음 혹은 마지막 몇 행은 각각 .head()와 .tail() 메서드로 볼 수 있습니다. 행 개수는 n 인수로 지정할 수 있으며 기본값은 5입니다.

df.head()

First five rows of the DataFrame (df) using .head()

DataFrame의 처음 5행

df.tail(n = 10)

Last 10 rows of the DataFrame using .tail()

DataFrame의 마지막 10행

.describe()로 데이터 이해하기

.describe() 메서드는 모든 수치형 열의 요약 통계를 출력합니다. 개수, 평균, 표준편차, 범위, 사분위수 등을 확인할 수 있습니다.

df.describe()

Get summary statistics with .describe()

.describe()로 요약 통계 얻기

수치형 데이터의 스케일, 왜도, 범위를 빠르게 훑어볼 수 있습니다.

percentiles 인수로 사분위수를 바꿀 수도 있습니다. 예를 들어 아래는 DataFrame df의 수치형 열에서 30%, 50%, 70% 분위수를 봅니다.

df.describe(percentiles=[0.3, 0.5, 0.7])

Get summary statistics with specific percentiles  pandas

특정 분위수로 요약 통계 구하기 

include 인수로 특정 데이터 타입만 요약하도록 제한할 수도 있습니다. 예를 들어 아래는 integer 타입 열만 요약합니다. 

df.describe(include=[int])

summary statistics of integer columns only pandas

정수형 열만의 요약 통계

반대로 exclude 인수로 특정 타입을 제외할 수도 있습니다.

df.describe(exclude=[int])
              BMI  DiabetesPedigreeFunction
count  768.000000                768.000000
mean    31.992578                  0.471876
std      7.884160                  0.331329
min      0.000000                  0.078000
25%     27.300000                  0.243750
50%     32.000000                  0.372500
75%     36.600000                  0.626250
max     67.100000                  2.420000


실무에서는 이러한 통계를 .T 속성으로 전치해 보는 것이 더 편할 때가 많습니다.

df.describe().T

Transpose summary statistics pandas

.T로 요약 통계 전치하기


DataFrame 설명에 대해 더 알고 싶다면 다음 치트시트를 참고하세요.

.info()로 데이터 이해하기

.info() 메서드는 DataFrame의 데이터 타입, 결측치, 데이터 크기를 빠르게 살펴보는 방법입니다. 여기서는 show_counts 인수를 True로 설정하여 각 열의 결측이 아닌 값 개수를 표시합니다. 또한 memory_usage를 True로 설정해 DataFrame 요소의 총 메모리 사용량을 보여줍니다. verbose가 True이면 .info()의 전체 요약을 출력합니다. 

df.info(show_counts=True, memory_usage=True, verbose=True)
<class 'pandas.DataFrame'>
RangeIndex: 768 entries, 0 to 767
Data columns (total 9 columns):
 #   Column                    Non-Null Count  Dtype  
---  ------                    --------------  -----  
 0   Pregnancies               768 non-null    int64  
 1   Glucose                   768 non-null    int64  
 2   BloodPressure             768 non-null    int64  
 3   SkinThickness             768 non-null    int64  
 4   Insulin                   768 non-null    int64  
 5   BMI                       768 non-null    float64
 6   DiabetesPedigreeFunction  768 non-null    float64
 7   Age                       768 non-null    int64  
 8   Outcome                   768 non-null    int64  
dtypes: float64(2), int64(7)
memory usage: 54.1 KB

.shape로 데이터 크기 파악하기

DataFrame의 행과 열 수는 .shape 속성으로 확인할 수 있습니다. (행, 열) 튜플을 반환하며, 인덱싱해 행만, 열만 각각 얻을 수 있습니다.

df.shape # Get the number of rows and columns
df.shape[0] # Get the number of rows only
df.shape[1] # Get the number of columns only
(768,9)
768
9

모든 열과 열 이름 가져오기

DataFrame 객체의 .columns 속성은 열 이름을 Index 객체 형태로 반환합니다. 참고로 pandas의 인덱스는 행/열의 주소/라벨입니다.

df.columns
Index(['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI',
       'DiabetesPedigreeFunction', 'Age', 'Outcome'],
      dtype='str')

list() 함수로 리스트로 변환할 수 있습니다.

list(df.columns)
['Pregnancies',
 'Glucose',
 'BloodPressure',
 'SkinThickness',
 'Insulin',
 'BMI',
 'DiabetesPedigreeFunction',
 'Age',
 'Outcome']

.isnull()로 결측치 확인

샘플 DataFrame에는 결측치가 없습니다. 예시를 위해 몇 개를 만들어 보겠습니다. .copy() 메서드는 원본 DataFrame의 복사본을 만듭니다. 복사본에서 작업하면 이후 예제를 위해 원본 df는 그대로 유지됩니다. 이후 다룰 .loc를 사용해 Pregnancies 열의 라벨 2~5 행을 결측으로 설정합니다. 결측치는 NaN이라는 float로 저장되므로, pandas는 해당 열을 int64에서 float64로 변환합니다.

df2 = df.copy()
df2.loc[2:5,'Pregnancies'] = None
df2.head(7)

Rows 2 to 5 are missing pandas

이제 2~5행이 NaN으로 표시됩니다

DataFrame의 각 원소가 결측인지 여부는 .isnull() 메서드로 확인할 수 있습니다.

df2.isnull().head(7)

실무에서는 결측이 얼마나 되는지 아는 것이 더 유용하므로, .isnull()에 .sum()을 결합해 각 열의 결측 개수를 셉니다.

df2.isnull().sum()
Pregnancies                 4
Glucose                     0
BloodPressure               0
SkinThickness               0
Insulin                     0
BMI                         0
DiabetesPedigreeFunction    0
Age                         0
Outcome                     0
dtype: int64

DataFrame 전체의 결측 총개수는 한 번 더 합계를 취해 구할 수 있습니다.

df2.isnull().sum().sum()
4

pandas에서 정렬, 슬라이싱, 데이터 추출

pandas는 DataFrame의 데이터 정렬, 부분집합 추출, 필터링, 분리 등을 여러 방식으로 제공합니다. 여기서는 가장 일반적인 방법을 살펴봅니다.

데이터 정렬

특정 열로 DataFrame을 정렬하려면 .sort_values()를 사용하세요. 이 메서드는 새로운 정렬된 DataFrame을 반환하고 df는 바꾸지 않으므로, 유지하려면 결과를 변수에 할당하세요:

df.sort_values(by="Age", ascending=False)  # 나이를 기준으로 내림차순 정렬

여러 열로도 정렬할 수 있습니다:

df.sort_values(by=["Age", "Glucose"], ascending=[False, True])

인덱스 재설정

정렬이나 필터링을 하면 원래 행 라벨이 유지되어 인덱스가 뒤죽박죽일 수 있습니다. .reset_index()로 0부터 시작하는 새 인덱스를 받으세요(더 많은 옵션은 pandas 인덱스 재설정 튜토리얼 참고):

df_sorted = df.sort_values(by="Age", ascending=False).reset_index(drop=True)  # drop=True는 예전 인덱스를 버립니다
df_sorted[["Age", "Glucose", "Outcome"]].head(3)
   Age  Glucose  Outcome
0   81      134        0
1   72      119        0
2   70      145        1

[ ]로 단일 열 분리 

대괄호 [ ]에 열 이름을 넣어 단일 열을 분리할 수 있습니다. 출력은 pandas Series 객체입니다. pandas Series는 정수, 실수, 문자열, 불리언, 파이썬 객체 등 어떤 타입이든 담을 수 있는 1차원 배열입니다. DataFrame은 많은 Series가 열로 모여 구성됩니다.

df['Outcome']
0      1
1      0
2      1
3      0
4      1
      ..
763    0
764    0
765    0
766    1
767    0
Name: Outcome, Length: 768, dtype: int64

[[ ]]로 두 개 이상의 열 분리 

대괄호 안에 열 이름 리스트를 제공해 여러 열을 가져올 수도 있습니다. 여기서는 대괄호를 두 번 사용합니다. 바깥 대괄호는 DataFrame의 부분집합을, 안쪽 대괄호는 리스트 생성을 의미합니다.

df[['Pregnancies', 'Outcome']]
     Pregnancies  Outcome
0              6        1
1              1        0
2              8        1
3              1        0
4              0        1
..           ...      ...
763           10        0
764            2        0
765            5        0
766            1        1
767            1        0

[768 rows x 2 columns]

[ ]로 단일 행 분리 

하나의 True 값을 가진 불리언 Series를 전달해 단일 행을 가져올 수 있습니다. 아래 예에서는 index = 1인 두 번째 행이 반환됩니다. 여기서 .index는 DataFrame의 행 라벨을 반환하며, 비교 연산은 이를 불리언 1차원 배열로 바꿉니다.

df[df.index==1]

Isolating one row in pandas

pandas에서 단일 행 분리

[ ]로 두 개 이상의 행 분리 

유사하게, == 연산자 대신 .isin() 메서드를 사용해 두 개 이상의 행을 반환할 수 있습니다.

df[df.index.isin(range(2,10))]

Isolating specific rows in pandas

pandas에서 특정 행 분리

.loc[]와 .iloc[]로 행 가져오기

.loc[]와 .iloc[]("location"과 "integer location")으로 라벨이나 조건으로 특정 행을 가져올 수 있습니다. .loc[]는 라벨로 행/열/셀을 가리키고, .iloc[]는 정수 위치로 가리킵니다. loc vs iloc 가이드에서 모든 차이를 다룹니다. 여기서는 앞서 만든 df2의 인덱스를 바꿔 라벨과 위치가 더 이상 일치하지 않게 해 핵심 차이를 보겠습니다.

.loc[] selects by label, .iloc[] by position

df2.index = range(1,769)

아래 예시는 DataFrame 대신 pandas Series를 반환합니다. .loc[1]에서 1은 라벨이므로 라벨 1인 행(재인덱싱 후 첫 행)을 반환합니다. .iloc[1]에서 1은 0부터 시작하는 위치이므로 두 번째 행을 반환하며, 그 라벨은 2입니다.

df2.loc[1]
Pregnancies                   6.000
Glucose                     148.000
BloodPressure                72.000
SkinThickness                35.000
Insulin                       0.000
BMI                          33.600
DiabetesPedigreeFunction      0.627
Age                          50.000
Outcome                       1.000
Name: 1, dtype: float64
df2.iloc[1]
Pregnancies                  1.000
Glucose                     85.000
BloodPressure               66.000
SkinThickness               29.000
Insulin                      0.000
BMI                         26.600
DiabetesPedigreeFunction     0.351
Age                         31.000
Outcome                      0.000
Name: 2, dtype: float64

대괄호에 범위를 제공해 여러 행을 가져올 수도 있습니다. 두 접근자는 범위 끝을 다르게 처리합니다. .loc[100:110]은 라벨 110을 포함해 11행을 반환하고, .iloc[100:110]은 위치 110 전에서 멈춰 10행을 반환합니다.

df2.loc[100:110]

Isolating rows with loc

.loc[]로 행 분리

df2.iloc[100:110]

Isolating rows in pandas with .loc[]

.iloc[]로 행 분리

범위 대신 리스트를 사용해 부분집합을 선택할 수도 있습니다.

df2.loc[[100, 200, 300]]

Isolating rows using a list in pandas with .loc[]

.loc[]로 리스트 기반 행 분리

df2.iloc[[100, 200, 300]]

Rows at positions 100, 200, and 300 selected with .iloc[]

.iloc[]로 리스트 기반 행 분리

행과 함께 특정 열을 선택할 수도 있습니다. 여기서 .iloc[]는 .loc[]와 다르게 열 라벨이 아니라 열 위치를 요구합니다.

df2.loc[100:110, ['Pregnancies', 'Glucose', 'BloodPressure']]
     Pregnancies  Glucose  BloodPressure
100          1.0      122             90
101          1.0      163             72
102          1.0      151             60
103          0.0      125             96
104          1.0       81             72
105          2.0       85             65
106          1.0      126             56
107          1.0       96            122
108          4.0      144             58
109          3.0       83             58
110          0.0       95             85
df2.iloc[100:110, :3]
     Pregnancies  Glucose  BloodPressure
101          1.0      163             72
102          1.0      151             60
103          0.0      125             96
104          1.0       81             72
105          2.0       85             65
106          1.0      126             56
107          1.0       96            122
108          4.0      144             58
109          3.0       83             58
110          0.0       95             85

더 빠른 워크플로를 위해 시작 인덱스만 지정한 범위를 전달할 수 있습니다.

df2.loc[760:, ['Pregnancies', 'Glucose', 'BloodPressure']]
     Pregnancies  Glucose  BloodPressure
760          6.0      190             92
761          2.0       88             58
762          9.0      170             74
763          9.0       89             62
764         10.0      101             76
765          2.0      122             70
766          5.0      121             72
767          1.0      126             60
768          1.0       93             70
df2.iloc[760:, :3]
     Pregnancies  Glucose  BloodPressure
761          2.0       88             58
762          9.0      170             74
763          9.0       89             62
764         10.0      101             76
765          2.0      122             70
766          5.0      121             72
767          1.0      126             60
768          1.0       93             70

.loc[]와 대입 연산자 =를 결합해 값을 갱신할 수 있습니다. 갱신하는 DataFrame 자체에서 조건을 만들세요. df에서 만든 조건은 새 인덱스를 가진 df2와 더 이상 맞지 않으며, pandas가 오류를 발생시킵니다.

df2.loc[df2["Age"] == 81, "Age"] = 80

조건으로 행 필터링

pandas는 행/열 값에 대한 조건으로 데이터를 필터링할 수 있습니다. 예를 들어 아래 코드는 혈압이 정확히 122인 행을 선택합니다. 대괄호 [ ]로 행을 분리하는 것은 앞선 섹션과 같지만, 이번에는 행 인덱스나 열 이름 대신 BloodPressure가 122인 조건을 입력합니다. 이 조건은 df.BloodPressure == 122로 표시합니다.

df[df.BloodPressure == 122]

Isolating rows based on a condition in pandas

조건에 따라 행 분리 

아래 예시는 Outcome이 1인 모든 행을 가져옵니다. 여기서 df.Outcome은 해당 열을 선택하고, df.Outcome == 1은 1과 같은지 판단한 불리언 Series를 반환하며, 마지막으로 []는 그 불리언 Series가 True인 행만 df에서 부분집합으로 가져옵니다.

df[df.Outcome == 1]

Isolating rows based on a condition in pandas

조건에 따라 행 분리 

> 연산자를 사용해 비교할 수도 있습니다. 아래 코드는 BloodPressure가 100보다 큰 모든 레코드에서 Pregnancies, Glucose, BloodPressure를 가져옵니다.

df.loc[df['BloodPressure'] > 100, ['Pregnancies', 'Glucose', 'BloodPressure']]
     Pregnancies  Glucose  BloodPressure
43             9      171            110
84             5      137            108
106            1       96            122
177            0      129            110
207            5      162            104
362            5      103            108
369            1      133            102
440            0      189            104
549            4      189            110
658           11      127            106
662            8      167            106
672           10       68            106
691           13      158            114

pandas에서 데이터 정리

데이터 정리는 데이터 과학에서 가장 흔한 작업 중 하나입니다. pandas는 머신 러닝/딥러닝 모델 학습을 포함하되 그에 국한되지 않는 어떤 용도로든 데이터를 전처리할 수 있게 해줍니다. 앞서 결측치 4개가 있던 df2 DataFrame을 사용해 몇 가지 데이터 정리 사례를 살펴보겠습니다. 다시 한 번, DataFrame의 결측 개수는 다음과 같이 볼 수 있습니다.

df2.isnull().sum()
Pregnancies                 4
Glucose                     0
BloodPressure               0
SkinThickness               0
Insulin                     0
BMI                         0
DiabetesPedigreeFunction    0
Age                         0
Outcome                     0
dtype: int64

결측치 처리 방법 #1: 결측값 제거

결측치를 제거하는 방법이 있습니다. 데이터가 충분해 일부를 잃어도 다운스트림 분석에 영향이 적은 경우 특히 유용합니다. 아래처럼 .dropna() 메서드를 사용하세요. 여기서는 .dropna() 결과를 DataFrame df3에 저장합니다.

df3 = df2.copy()
df3 = df3.dropna()
df3.shape
(764, 9) # this is 4 rows less than df2

axis 인수로 결측이 있는 행을 제거할지, 아니면 열을 제거할지 지정할 수 있습니다. 기본 axis는 NaN이 포함된 행을 제거합니다. axis = 1을 사용하면 하나 이상의 NaN이 있는 열을 제거합니다. 이 튜토리얼의 모든 예제와 마찬가지로, pandas 3.1에서 .dropna()의 inplace=True가 더는 권장되지 않으므로 결과를 재할당합니다.

df3 = df2.dropna(axis=1)
list(df3.columns)
['Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age', 'Outcome']

기본적으로 .dropna()는 값 중 하나라도 결측이면 그 행을 삭제합니다. how 인수를 'all'로 설정하면 모든 값이 결측인 행만 삭제합니다. df2에는 완전히 비어 있는 행이 없으므로 아무 것도 삭제되지 않습니다:

df3 = df2.dropna(how="all")
df3.shape
(768, 9)

결측치 처리 방법 #2: 결측값 대치

결측값을 삭제하는 대신 요약 통계나 고정값으로 채울 수도 있습니다. 예를 들어 일주일 온도 기록에서 하루가 비어 있다면, 그 주의 평균으로 채우면 행을 보존하면서 정보 손실을 최소화할 수 있습니다. 아래 코드는 결측인 Pregnancies 값을 해당 열의 평균으로 채웁니다.

df3 = df2.copy()
# Get the mean of Pregnancies
mean_value = df3["Pregnancies"].mean()
# Fill only that column's missing values
df3["Pregnancies"] = df3["Pregnancies"].fillna(mean_value)
df3["Pregnancies"].head(7)
1    6.000000
2    1.000000
3    3.846859
4    3.846859
5    3.846859
6    3.846859
7    3.000000
Name: Pregnancies, dtype: float64

중복 데이터 처리

DataFrame에서 중복을 제거하는 방법을 배우기 위해 원본 데이터에 중복을 추가해 보겠습니다. 여기서는 pd.concat()으로 df2의 행을 다시 df2에 이어붙여 df2의 모든 행과 완전히 동일한 복제본을 추가합니다. 

df3 = pd.concat([df2, df2])
df3.shape
(1536, 9)

.drop_duplicates() 메서드로 DataFrame에서 모든 중복 행(기본값)을 제거할 수 있습니다.

df3 = df3.drop_duplicates()
df3.shape
(768, 9)

열 이름 바꾸기

자주 하는 데이터 정리 작업 중 하나가 열 이름 바꾸기입니다. .rename() 메서드에 이전 이름과 새 이름을 매핑한 columns 딕셔너리를 전달하세요:

df3 = df3.rename(columns={"DiabetesPedigreeFunction": "DPF"})
df3[["Glucose", "BMI", "DPF", "Age"]].head()
   Glucose   BMI    DPF  Age
1      148  33.6  0.627   50
2       85  26.6  0.351   31
3      183  23.3  0.672   32
4       89  28.1  0.167   21
5      137  43.1  2.288   33

.columns에 전체 이름 리스트를 할당할 수도 있습니다. 이 리스트는 현재 순서대로 모든 열을 포함해야 합니다. pandas는 위치로 이름을 할당하므로, 순서가 잘못된 리스트는 조용히 데이터를 잘못 라벨링합니다.

df3.columns = ["Pregnancies", "Glucose", "BloodPressure", "SkinThickness", "Insulin", "BMI", "DPF", "Age", "Outcome"]
list(df3.columns)
['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DPF', 'Age', 'Outcome']

데이터 정리에 대해 더 알고 싶고, 더 쉬우며 예측 가능한 워크플로가 필요하다면, 일반적인 데이터 정리 작업을 종합적으로 담은 다음 체크리스트를 확인하세요. 

pandas에서 DataFrame 결합

pandas는 두 가지 방식으로 DataFrame을 결합합니다. .merge()는 SQL 조인처럼 공통 키 열을 기준으로 테이블을 결합하고, pd.concat()은 테이블을 위아래(또는 좌우)로 이어붙입니다.

.merge()로 DataFrame 병합

두 테이블이 키 열을 공유할 때 .merge()를 사용하세요. 예를 들어 두 번째 테이블이 각 Outcome 코드에 읽기 쉬운 레이블을 매핑한다고 합시다. Outcome에 대한 왼쪽 조인은 각 환자 행에 그 레이블을 추가합니다:

outcome_labels = pd.DataFrame({"Outcome": [0, 1], "Diagnosis": ["Non-diabetic", "Diabetic"]})

df_labeled = df.merge(outcome_labels, on="Outcome", how="left")
df_labeled[["Glucose", "Outcome", "Diagnosis"]].head(3)
   Glucose  Outcome     Diagnosis
0      148        1      Diabetic
1       85        0  Non-diabetic
2      183        1      Diabetic

how 인수는 조인 유형을 지정합니다. "left"는 df의 모든 행을 유지하고, "inner"는 두 테이블 모두에서 일치하는 행만 유지하며, "outer"는 양쪽의 모든 행을 유지합니다. pandas에서 DataFrame 조인하기 튜토리얼에서 .join()과 모든 조인 유형을 자세히 다룹니다.

pd.concat()으로 DataFrame 이어붙이기

두 테이블의 열이 같고 행을 쌓아올리고 싶을 때 pd.concat()을 사용하세요. 예를 들어 두 번에 걸쳐 들어온 환자 기록을 합치는 경우입니다. 각 배치의 라벨 대신 0부터 시작하는 새 인덱스를 얻으려면 ignore_index=True를 설정하세요:

batch_1 = df.iloc[:500]
batch_2 = df.iloc[500:]

df_combined = pd.concat([batch_1, batch_2], ignore_index=True)
df_combined.shape
(768, 9)

axis=1을 지정하면, pd.concat()은 인덱스 라벨을 기준으로 테이블을 좌우로 나란히 배치합니다:

measurements = df[["Glucose", "BMI"]]
outcomes = df[["Outcome"]]

pd.concat([measurements, outcomes], axis=1).head(3)
   Glucose   BMI  Outcome
0      148  33.6        1
1       85  26.6        0
2      183  23.3        1

두 방법을 실습하려면 Joining Data with pandas 강좌를 이용해 보세요.

pandas에서 데이터 분석

pandas의 핵심 가치는 빠른 데이터 분석 기능에 있습니다. 이 섹션에서는 pandas에서 사용할 수 있는 몇 가지 분석 기법에 초점을 맞춥니다.

요약 연산자(mean, mode, median)

앞서 보았듯 .mean() 메서드로 각 열의 평균값을 구할 수 있습니다.

df.mean()
Pregnancies                   3.845052
Glucose                     120.894531
BloodPressure                69.105469
SkinThickness                20.536458
Insulin                      79.799479
BMI                          31.992578
DiabetesPedigreeFunction      0.471876
Age                          33.240885
Outcome                       0.348958
dtype: float64

최빈값은 .mode() 메서드로 비슷하게 계산합니다. 

df.mode()

Mode of each column in pandas

pandas에서 각 열의 최빈값 출력

마찬가지로 중앙값은 .median() 메서드로 계산합니다.

df.median()
Pregnancies                   3.0000
Glucose                     117.0000
BloodPressure                72.0000
SkinThickness                23.0000
Insulin                      30.5000
BMI                          32.0000
DiabetesPedigreeFunction      0.3725
Age                          29.0000
Outcome                       0.0000
dtype: float64

기존 열로부터 새 열 만들기 

pandas는 스칼라 변수처럼 두 개 이상의 열을 결합해 빠르고 효율적으로 계산합니다. 아래 코드는 Glucose 열 각 값을 Insulin 열의 해당 값으로 나누어 Glucose_Insulin_Ratio라는 새 열을 계산합니다.

df2['Glucose_Insulin_Ratio'] = df2['Glucose']/df2['Insulin']
df2.head()

Create a new column from existing columns in pandas

pandas에서 기존 열로 새 열 만들기

Insulin이 0인 행은 0으로 나누면 무한대가 되므로 inf가 표시됩니다. 이 데이터셋에서 Insulin의 0은 측정값이 없음을 의미하므로(768행 중 374행), 나누기 전에 이 0을 결측으로 취급하세요:

df2["Glucose_Insulin_Ratio"] = df2["Glucose"] / df2["Insulin"].where(df2["Insulin"] > 0)
df2["Glucose_Insulin_Ratio"].head()
1         NaN
2         NaN
3         NaN
4    0.946809
5    0.815476
Name: Glucose_Insulin_Ratio, dtype: float64

.where()는 조건을 만족하는 값은 유지하고 나머지는 NaN으로 바꾸므로, 해당 행에서는 비율이 무한대가 아니라 결측으로 남습니다. pandas에서 열 추가 튜토리얼에서 파생 열을 만드는 다른 방법을 확인하세요.

.value_counts()로 개수 세기

열이 범주를 담고 있다면, 각 범주에 몇 개의 관측치가 있는지 세고 싶을 때가 많습니다. .value_counts() 메서드는 이를 수행합니다. 예를 들어 아래에서는 Outcome이 당뇨(1)인 경우와 비당뇨(0)인 경우의 관측치 개수를 셉니다.

df['Outcome'].value_counts()
Outcome
0    500
1    268
Name: count, dtype: int64

normalize 인수를 추가하면 절대 개수 대신 비율을 반환합니다.

df['Outcome'].value_counts(normalize=True)
Outcome
0    0.651042
1    0.348958
Name: proportion, dtype: float64


sort 인수로 결과의 자동 정렬을 끌 수 있습니다(기본값 True). 기본 정렬은 개수 기준 내림차순입니다.

df['Outcome'].value_counts(sort=False)
Outcome
1    268
0    500
Name: count, dtype: int64

.value_counts()는 열뿐 아니라 DataFrame과 그 안의 특정 열 부분집합에도 적용할 수 있습니다. 아래는 subset 인수로 열 리스트를 전달해 df에 value_counts()를 적용하는 예입니다. 

df.value_counts(subset=['Pregnancies', 'Outcome'])
Pregnancies  Outcome
1            0          106
2            0           84
0            0           73
3            0           48
4            0           45
0            1           38
5            0           36
6            0           34
1            1           29
3            1           27
7            1           25
4            1           23
8            1           22
5            1           21
7            0           20
2            1           19
9            1           18
6            1           16
8            0           16
10           0           14
             1           10
9            0           10
11           1            7
13           0            5
             1            5
12           0            5
11           0            4
12           1            4
14           1            2
15           1            1
17           1            1
Name: count, dtype: int64

pandas에서 .groupby()로 데이터 집계

pandas는 특정 열 값을 기준으로 그룹화해 값을 집계할 수 있습니다. .groupby() 메서드를 요약 메서드와 결합해 사용합니다. 아래 코드는 Outcome별로 그룹화해 각 수치형 열의 평균을 표시합니다.

df.groupby('Outcome').mean()

Aggregating data by one column in pandas

하나의 열로 데이터 집계

.groupby()는 아래처럼 열 이름 리스트를 전달해 둘 이상의 열로 그룹화할 수도 있습니다.

df.groupby(['Pregnancies', 'Outcome']).mean()

Aggregating data by two columns in pandas

두 열로 데이터 집계

.min(), .max(), .mean(), .median(), .sum() 등 어떤 요약 메서드도 .groupby()와 함께 사용할 수 있습니다. pandas GroupBy 튜토리얼에서 .agg()를 활용한 다중 집계와 다른 패턴을 다룹니다.

피벗 테이블 

pandas는 피벗 테이블로 요약 통계를 계산할 수도 있습니다. 이는 변수 조합을 바탕으로 결론을 내리기 쉽게 해줍니다. 아래 코드는 행을 Pregnancies의 고유값, 열을 Outcome의 고유값으로 하고, 셀에는 해당 그룹의 BMI 평균을 담습니다.

예를 들어 Pregnancies = 5이고 Outcome = 0인 경우 평균 BMI는 31.1입니다.

pd.pivot_table(df, values="BMI", index='Pregnancies', 
               columns=['Outcome'], aggfunc='mean')
Outcome              0          1
Pregnancies                      
0            31.727397  39.213158
1            29.616038  37.793103
2            29.679762  34.578947
3            29.231250  32.548148
4            31.255556  33.873913
5            31.100000  36.780952
6            29.591176  31.775000
7            29.975000  34.756000
8            30.693750  32.204545
9            28.840000  33.300000
10           30.114286  31.380000
11           37.125000  39.385714
12           30.560000  34.575000
13           33.280000  36.720000
14                 NaN  35.100000
15                 NaN  37.100000
17                 NaN  40.900000

pandas에서 데이터 시각화

pandas는 Matplotlib 플로팅 함수에 대한 간편 래퍼를 제공해 DataFrame을 쉽게 시각화할 수 있게 합니다. 아래에서 pandas로 흔히 하는 시각화를 살펴봅니다.

pandas의 선 그래프

pandas는 선 그래프로 변수 간 관계를 도식화할 수 있습니다. 아래는 인덱스를 기준으로 BMI와 Glucose를 그린 선 그래프입니다.

df[['BMI', 'Glucose']].plot.line()

Basic lineplot with pandas

pandas의 기본 선 그래프

색상은 color 인수로 지정할 수 있습니다.

df[['BMI', 'Glucose']].plot.line(color={"BMI": "red", "Glucose": "blue"})

Basic line plot with pandas, with custom colors

사용자 지정 색상의 기본 선 그래프

또한 subplots 인수로 df의 모든 열을 서로 다른 스케일과 축으로 그릴 수 있습니다.

df.plot.line(subplots=True)

Subplots for line plots with pandas

pandas의 선 그래프 서브플롯

pandas의 막대 그래프

이산형 열은 범주 개수에 대한 막대 그래프로 분포를 시각화할 수 있습니다. 이진 값인 Outcome 변수를 아래에 시각화했습니다.

df['Outcome'].value_counts().plot.bar()

Bar plot of Outcome counts in pandas

pandas의 막대 그래프

pandas의 상자 그림

연속형 변수의 사분위 분포는 상자 그림(boxplot)으로 시각화할 수 있습니다. 아래 코드는 pandas로 상자 그림을 만듭니다.

df.boxplot(column=['BMI'], by='Outcome')

Boxplots in pandas
pandas의 상자 그림

마무리

이제 핵심 pandas 워크플로를 익혔습니다. 파일을 DataFrame으로 읽고, .head(), .info(), .describe()로 살펴보고, .loc[]와 .iloc[]로 행을 선택하며, 결측치와 중복을 정리하고, 테이블을 병합하고, .groupby()와 피벗 테이블로 요약합니다.

2026년 이전에 pandas를 배웠다면 바꾸어야 할 습관이 하나 있습니다. inplace=True 대신 결과를 재할당하고, 모든 갱신은 한 번의 .loc[] 호출로 수행하세요. 나머지를 빠르게 숙달하는 가장 좋은 방법은 관심 있는 데이터셋으로 워크플로를 반복해 보는 것입니다. 다음 자료가 학습을 더욱 도와줍니다:

pandas 자주 묻는 질문(FAQ)

Python에서 pandas란 무엇인가요?

pandas는 표 형태 데이터를 다루는 오픈 소스 Python 라이브러리입니다. 핵심 데이터 구조인 DataFrame(테이블)과 Series(단일 열)는 데이터의 가져오기, 정리, 재구조화, 집계, 시각화를 위한 함수들을 제공하므로, Python에서 데이터 분석의 표준 도구로 자리잡았습니다.

왜 pandas를 배워야 하나요?

Python에서 데이터를 다룬다면 pandas는 사실상 꼭 배워야 합니다. 데이터 처리와 분석 과정을 단순화해, 인사이트를 도출하고 가치를 만드는 데 집중할 수 있게 해줍니다. 소규모부터 대규모 데이터까지, pandas는 속도와 유연성, 사용자 친화적인 데이터 구조로 작업을 훨씬 수월하게 만들어 줍니다.

pandas는 어떻게 설치하나요?

터미널에서 pip install pandas를 실행하거나, conda를 사용한다면 conda install pandas를 실행하세요. pandas 3는 Python 3.11 이상이 필요합니다. Anaconda에는 기본으로 pandas가 포함되어 있으며, DataCamp의 DataLab에는 사전 설치되어 있습니다.

pandas의 기본 데이터 구조는 무엇인가요?

pandas의 두 가지 기본 데이터 구조는 Series와 DataFrame입니다. Series는 본질적으로 하나의 열이고, DataFrame은 여러 Series로 이루어진 다차원 테이블입니다. 이 구조는 정수, 문자열, 실수 등 서로 다른 타입의 데이터를 유연하게 담을 수 있습니다.

pandas는 대규모 데이터셋에 적합한가요?

pandas는 데이터가 컴퓨터 메모리에 들어오기만 하면 수백만 행도 무난히 처리합니다. 더 큰 데이터는 chunksize 인수로 배치 단위로 읽거나, Polars, Dask, PySpark 같은 대용량용 도구로 전환하세요.

pandas로 데이터를 어떻게 가져오나요?

pandas는 CSV, Excel, SQL 데이터베이스, JSON 등 다양한 파일 형식에서 데이터를 읽을 수 있습니다. pd.read_csv(), pd.read_excel(), pd.read_sql(), pd.read_json() 명령이 각 형식의 데이터를 가져오며, 모두 DataFrame을 반환합니다. 반환된 DataFrame은 pandas로 조작할 수 있습니다.

pandas 3.0에서는 무엇이 바뀌었나요?

2026년 1월 출시된 pandas 3.0은 Copy-on-Write를 기본으로 하여 모든 부분집합이 복사처럼 동작하고, df["col"][0] = x 같은 체이닝 할당이 더는 원본 DataFrame을 갱신하지 않게 했습니다. 또한 텍스트 열을 전용 str 데이터 타입으로 추론하며, Python 3.11 이상이 필요합니다. 이어서 pandas 3.1은 dropna(), sort_values() 같은 메서드에서 inplace=True 사용을 더는 권장하지 않습니다.

pandas에서 loc와 iloc의 차이는 무엇인가요?

.loc[]는 라벨로, .iloc[]는 0부터 시작하는 정수 위치로 행과 열을 선택합니다. 슬라이스도 다릅니다. .loc[100:110]은 끝 라벨을 포함하지만, .iloc[100:110]은 위치 110 전에서 멈춥니다. 더 많은 예시는 loc vs iloc 가이드를 참고하세요.

pandas에서 두 DataFrame을 어떻게 병합하나요?

공통 열을 기준으로 두 DataFrame을 조인하려면 df1.merge(df2, on="key", how="left")를 사용하세요. how 인수로 조인 유형("left", "right", "inner", "outer")을 선택합니다. 행을 쌓아 올리려면 pd.concat()을 사용하세요.

주제