6.4.6 데이터프레임의 다양한 수정

① 열 삽입

다음 df를 정의하자.

import numpy as np
import pandas as pd

dates = pd.date_range("20240102", periods=6)
df = pd.DataFrame(np.arange(24).reshape(6, 4), index=dates)
df.columns = list('ABCD')
print(df)

새로운 열에 삽입할 시리즈를 하나 생성한다.

s1 = pd.Series([1, 2, 3, 4, 5], index=pd.date_range("20240102", periods=5))
print(s1)

다음으로 열 ‘E’를 새로 만들어 값을 대입한다. 위 s12024-01-07이 없으므로 결측값에는 NaN 값이 삽입된다.

df["E"] = s1
print(df)

② 레이블로 값 대입

다음 df.loc['2024-01-02', 'A']로 행과 열의 레이블로 지정한 요소의 값을 대입할 수 있다.

df.loc['2024-01-02', 'A'] = 10
print(df)

위에서 이미 정의한 dates를 행의 인자로 사용할 수 있다.

df.loc[dates[1], 'B'] = 50
print(df)

다음 df.at[dates[2], 'C']으로 행과 열의 레이블로 지정한 요소의 값을 대입한다.

df.at[dates[2], 'C'] = 100
print(df)

행과 열의 레이블은 각각 df.index[i], df.columns[j]로도 참조 가능하다.

df.at[df.index[-1], df.columns[-1]] = 230
print(df)

③ 위치로 값 대입

다음처럼 df.iloc[1, 2]로 첨자 1, 2의 값을 수정할 수 있다.

df.iloc[1, 2] = 60
print(df)

또한 df.iat[i, j]로 첨자 i, j의 값을 수정할 수 있다.

df.iat[3, 3] = 150
print(df)

다음은 df.iloc[:, 4]의 4 첨자(E열)의 모든 값을 500으로 수정한다.

df.iloc[:, 4] = [500] * len(df)
print(df)

④ 데이터프레임의 NaN으로 표시되는 결측값

다음 7행 5열의 데이터프레임을 생성하자.

import numpy as np
import pandas as pd

dates = pd.date_range("20250302", periods=7, freq='W-MON')
df = pd.DataFrame(np.arange(35).reshape(7, 5), index=dates, columns=list('ABCDE'))
print(df)

다음으로 2025년 3월 7일 이후, 월요일로 시작되는 주 5회의 날짜 시퀀스를 생성한다.

subdates = pd.date_range("20250307", periods=5, freq='W-MON')
print(subdates)

위 날짜를 index 요소로 하는 5개의 시리즈를 생성한다.

s = pd.Series(np.linspace(10, 17, 5), index=subdates)
print(s)

시리즈 sdf의 새로운 열 “F”에 저장하면 첫 행과 마지막 행이 없어 결측값(missing value)인 NaN으로 표시된다.

df['F'] = s
print(df)

⑤ np.nan으로 결측값 대입

다음 코드로 첨자 위치 3, 4와 두 번째 행 모두를 결측값인 np.nan으로 대입한다.

df2 = df.copy()
df2.iloc[3, 4] = np.nan
df2.iloc[1, :] = np.nan
print(df2)

⑥ isna()와 count()

다음 데이터프레임 원소가 결측값인지의 여부를 pd.isna(df) 또는 df.isna()로 알 수 있다.

pd.isna(df2)
df2.isna()

결측값인지의 여부를 df.isnull()로도 알 수 있다.

df2.isnull()

함수 count()로 결측값을 제외한 모든 열의 원소 수를 알 수 있다.

df2.count()

df.count(axis=1)로 결측값을 제외한 모든 행의 원소 수를 알 수 있다.

df2.count(axis=1)

함수 value_counts()는 고유한 값의 빈도를 포함하는 시리즈를 반환한다.

⑦ 행과 열 삭제: drop()

필요 없는 행이나 열을 제거할 때는 drop() 함수를 사용합니다. 이때 axis 설정이 매우 중요합니다.

  • axis=0: 행(Row) 삭제 (가로줄)
  • axis=1: 열(Column) 삭제 (세로줄)
# 6.4.6 'A' 컬럼 삭제 (axis=1)
df_dropped_col = df.drop('A', axis=1)

# 6.4.6 '2024-01-02' 인덱스 행 삭제 (axis=0)
df_dropped_row = df.drop(df.index[0], axis=0)

⑧ 컬럼 이름 변경: rename()

컬럼 이름을 보기 좋게 바꿀 때 사용합니다. 딕셔너리 형태로 {'기존이름': '새이름'}을 전달합니다.

# 6.4.6 A를 "Alpha", B를 "Beta"로 변경
df_renamed = df.rename(columns={'A': 'Alpha', 'B': 'Beta'})
# 6.4.6 print(df_renamed)

⑨ 변수 간 상관관계: corr()

두 숫자형 변수가 얼마나 서로 관련이 있는지(-1 ~ 1 사이의 값) 상관계수(Correlation)를 보여줍니다. 데이터 분석 시 변수들 사이의 숨겨진 관계를 숫자로 빠르게 파악할 때 유용합니다.

# 6.4.6 각 숫자형 열들 사이의 상관계수 계산
print(df.corr())
서브목차