Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python으로 DataFrame의 대각선 요소를 1로 변경하는 방법

이 글에서는 pandas DataFrame의 대각선(diagonal)에 위치한 모든 값을 1로 변경하는 프로그램을 Python으로 작성하는 방법을 알아보겠습니다.

문제 정의

예를 들어 다음과 같은 DataFrame이 있다고 가정해 보겠습니다.

    0   1   2
0  10  20  30
1  40  50  60
2  70  80  90

대각선 위치의 값들을 1로 교체하면 결과는 다음과 같습니다.

    0   1   2
0   1  20  30
1  40   1  60
2  70  80   1

해결 방법

이 문제를 해결하기 위해 아래 단계를 순서대로 따릅니다.

  • 먼저 DataFrame을 정의합니다.
  • 모든 행과 열에 접근하기 위해 중첩 for 루프(nested loop)를 생성합니다.
for i in range(len(df)):
    for j in range(len(df)):
  • 행 인덱스와 열 인덱스가 같은지, 즉 대각선 조건에 해당하는지 확인합니다. 조건이 일치하면 해당 위치의 값을 1로 교체합니다.
if i == j:
    df.iloc[i, j] = 1

여기서 i == j는 행 번호와 열 번호가 동일한 경우, 즉 주대각선(main diagonal)에 해당하는 원소임을 의미합니다. df.iloc[i, j]는 위치 기반 인덱싱을 사용하여 특정 셀에 접근하는 pandas 메서드입니다.

전체 예제 코드

아래 구현 예제를 통해 더 자세히 이해해 보겠습니다.

import pandas as pd
import numpy as np

data = [[10, 20, 30], [40, 50, 60], [70, 80, 90]]
df = pd.DataFrame(data)

print("Original DataFrame is\n", df)

for i in range(len(df)):
    for j in range(len(df)):
        if i == j:
            df.iloc[i, j] = 1

print("Modified DataFrame is\n", df)

출력 결과

Original DataFrame is
     0   1   2
0  10  20  30
1  40  50  60
2  70  80  90
Modified DataFrame is
     0   1   2
0   1  20  30
1  40   1  60
2  70  80   1

참고: 더 간단한 대안 방법

중첩 루프 대신 NumPy의 fill_diagonal() 함수를 사용하면 한 줄로 동일한 결과를 얻을 수 있습니다.

np.fill_diagonal(df.values, 1)

또한 len(df)는 행의 개수를 반환하므로, 정방향(n×n) DataFrame이 아닌 경우에는 min(len(df), len(df.columns))을 사용하여 범위를 제한하는 것이 안전합니다.