반응형

 

 

💬 SettingWithCopyWarning:
Pandas에서 특정 조건으로 값을 수정할 때 자주 등장하는 애매한 경고!
"왜 바꿨는데 경고가 뜨지?" 싶은 분들을 위한 설명입니다.

 


 

❗ 경고 메시지 예시

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

 

 

🔍 원인: DataFrame에서 복사본에 값을 할당할 때

df2 = df[df['score'] > 90]
df2['grade'] = 'A'  # ❗ 경고 발생 가능

 

 

→ 이 코드는 원본 df가 아니라 df의 일부 복사본에 값을 설정하려고 하므로 경고가 뜹니다.


 

🛠️ 해결 방법

✔ .loc[]을 명시적으로 사용

df.loc[df['score'] > 90, 'grade'] = 'A'  # ✅ 안전한 방식

 

✔ .copy()를 사용해 아예 복사본임을 명시

df2 = df[df['score'] > 90].copy()
df2['grade'] = 'A'  # ✅ 명시된 복사본엔 경고 없음

 

 


✅ 마무리 정리

  • Pandas는 슬라이싱 결과가 복사본인지, 뷰인지 애매할 수 있어 경고를 띄웁니다.
  • .copy()나 .loc[]를 명확하게 써주면 경고를 방지할 수 있습니다.
반응형
반응형

💬 IndexError: list index out of range
리스트의 범위를 벗어난 인덱스를 접근할 때 자주 나오는 에러입니다.

 

❗ 에러 메시지 예시

 

IndexError: list index out of range

 

리스트나 튜플 등 인덱스로 접근 가능한 자료형에서
존재하지 않는 인덱스를 호출하면 발생합니다.

 


 

🔍 원인: 리스트 길이보다 큰 인덱스를 호출

 

my_list = [10, 20, 30]
print(my_list[3])  # ❌ 존재하지 않음 → IndexError

 

→ 인덱스는 0부터 시작합니다. 위 리스트의 인덱스는 0, 1, 2뿐입니다.

 


 

🧪 자주 발생하는 상황

① for문에서 범위를 잘못 설정

for i in range(len(my_list) + 1):
    print(my_list[i])  # 마지막에 IndexError 발생

 

② 빈 리스트에 접근

data = []
print(data[0])  # ❌ 빈 리스트 → 어떤 인덱스도 존재하지 않음

 


 

 

🛠️ 해결 방법

1. 리스트의 길이를 먼저 확인하기

if len(data) > 0:
    print(data[0])

 

2. try-except로 안전하게 처리

try:
    print(my_list[3])
except IndexError:
    print("유효하지 않은 인덱스입니다.")

 


 

✅ 마무리 정리

  • 인덱스는 항상 0 ~ len(list)-1 사이여야 합니다.
  • len() 함수로 범위를 확인하고, 잘못된 접근은 예외처리로 막으세요.
반응형
반응형

💬 TypeError: 'int' object is not subscriptable
흔하지만 당황스러운 이 에러,
대체 왜 뜨는 걸까요?

 

 

❗ 에러 메시지 예시

TypeError: 'int' object is not subscriptable

이 에러는 정수(int) 를 마치 리스트나 문자열처럼 인덱싱(슬라이싱) 하려 할 때 발생합니다.

 

 

🔍 원인: 정수는 인덱싱이 불가능한 타입

subscriptable이라는 말은 쉽게 말해 **[]로 접근이 가능한가?**를 뜻합니다.
예를 들어 리스트나 문자열은 인덱스로 접근이 가능하죠:

 

my_list = [10, 20, 30]
print(my_list[0])   # ✅ 가능

 

그런데 정수는?

 

num = 123
print(num[0])       # ❌ TypeError 발생

 

정수는 인덱싱할 수 없기 때문에 에러가 납니다.

 

 

🧪 자주 발생하는 실수

① 함수 결과를 잘못 다룰 때

def get_number():
    return 123

result = get_number()
print(result[0])   # ❌ 리스트라고 착각하고 인덱싱 → 에러 발생

 

return 값이 리스트인지, 숫자인지 확인 필요!

 

 

② 타입이 바뀐 것을 인식 못할 때

data = {'score': 100}
score = data['score']
print(score[0])    # ❌ 숫자인데 인덱싱함

 

→ score는 숫자입니다. score[0]은 불가능하죠.

 

🛠️ 해결 방법

1. 값의 타입 확인하기

print(type(score))   # <class 'int'>

 

2. 필요한 타입으로 변환하거나 인덱싱하지 않기

  • 리스트나 문자열처럼 다루고 싶다면 문자열로 변환
num = 123
num_str = str(num)
print(num_str[0])   # ✅ '1'

 

3. 함수나 변수 이름이 의도한 타입과 일치하는지 확인하기

 

✅ 마무리 정리

  • TypeError: 'int' object is not subscriptable는
    숫자를 리스트처럼 다뤄서 생기는 에러입니다.
  • []를 쓸 수 있는 자료형은 리스트, 문자열, 튜플 등이고
    int, float, bool 등은 subscriptable하지 않아요.
  • 값을 확인하고, 슬라이싱하려면 적절한 타입으로 변환하세요.

 

📘 함께 보면 좋은 글

반응형
반응형

 

 

💬 KeyError: 'column_name'
데이터 다루다 보면 꼭 한 번은 마주치는 이 에러.
왜 발생하고, 어떻게 예방할 수 있을까요?

 

 

❗ 에러 메시지 예시

KeyError: 'price'

→ 없는 key(또는 column)를 찾으려 해서 발생한 오류입니다.

 

🔍 원인: 딕셔너리나 DataFrame에서 없는 키를 호출했을 때

my_dict = {'a': 1, 'b': 2}
print(my_dict['c'])    # ❌ KeyError 발생

또는 Pandas에서:

import pandas as pd

df = pd.DataFrame({
    'name': ['a', 'b'],
    'value': [1, 2]
})

df['price']    # ❌ 'price'라는 컬럼이 없음

 

 

🧪 자주 발생하는 사례

✅ 오타

df['Price']    # 대소문자 구분 때문에 오류 발생

 

✅ drop(), groupby(), merge() 등에서 존재하지 않는 컬럼 지정

df.drop(columns=['price'])  # 없는 컬럼이면 KeyError

 

 

🛠️ 해결 방법

✔ 컬럼 존재 여부 확인 후 사용

if 'price' in df.columns:
    df['price']
else:
    print("컬럼이 없습니다.")

 

✔ get() 사용 (딕셔너리에서)

value = my_dict.get('c', 0)  # 없으면 기본값 0

 

✔ try-except로 에러 방지

try:
    df['price']
except KeyError:
    print("해당 컬럼이 존재하지 않습니다.")

 

 

✅ 마무리 정리

  • KeyError는 존재하지 않는 키나 컬럼명을 호출할 때 발생합니다.
  • 오타, 대소문자 구분, 컬럼 삭제 후 호출 등의 실수가 원인일 수 있습니다.
  • 호출 전에 in으로 존재 여부를 체크하거나, get()을 사용해 안전하게 처리하세요.

 

📘 다음에 보면 좋은 글

🔹 [에러 해결] ValueError: could not convert string to float – 왜 이런 에러가 날까?

반응형
반응형

 

❗ 에러 메시지의 정체

데이터 분석 중 이런 에러를 본 적 있나요?

ValueError: could not convert string to float: 'abc'

처음엔 당황스럽지만, 이 에러는 매우 흔합니다.
이유는 간단합니다. 파이썬이 문자열을 숫자로 바꾸지 못해서 그래요.

 

🔍 원인: 문자열인데 float로 바꾸려 해서

float() 함수나 astype(float)를 사용할 때,
숫자처럼 생기지 않은 문자열이 들어오면 에러가 납니다.

예시:

float('123.45')     # ✅ 가능
float('abc')        # ❌ ValueError 발생

 

 

🧪 자주 발생하는 사례

판다스에서 숫자가 들어간 컬럼처럼 보이지만, 실제로는
쉼표, 문자 등이 섞여 있는 경우가 많습니다.

 

import pandas as pd

df = pd.DataFrame({
    'price': ['1000', '2000', '1,500', 'free']
})

df['price'] = df['price'].astype(float)

 

 

결과:

ValueError: could not convert string to float: '1,500'

 

 

🛠️ 해결 방법

✔ 방법 1: 쉼표 제거하기

df['price'] = df['price'].str.replace(',', '')
df['price'] = df['price'].astype(float)

 

✔ 방법 2: 문자 제거하고 숫자만 변환 (에러는 NaN 처리)

df['price'] = pd.to_numeric(df['price'].str.replace(',', ''), errors='coerce')

 

 

✅ 마무리 정리

  • 이 에러는 문자열을 숫자로 바꾸는 과정에서 발생합니다.
  • 특히 쉼표, 문자 등 숫자가 아닌 요소가 섞여 있으면 오류가 납니다.
  • 전처리로 깨끗하게 만들거나, 오류를 NaN으로 처리하면 해결됩니다.

 

반응형
반응형

 

카드 뭉치 소스 코드

def solution(cards1, cards2, goal):
    answer = 'Yes'
    cards1_idx = 0
    cards2_idx = 0
    
    for word in goal:
        if cards1_idx != len(cards1) and word == cards1[cards1_idx]:
            # A and B -> A를 먼저 판별 / A에서 통과하면 B를 판별 / A에서 통과하지 않으면 B까지도 가지 않습니다.
            cards1_idx += 1
        else: # 첫번째 카드뭉치에 없다면
            if cards2_idx != len(cards2) and word == cards2[cards2_idx]:
                cards2_idx += 1
            else: # 두번째 카드뭉치에도 없다면
                answer = 'No'
                break
    
    return answer
반응형
반응형

 

안녕하세요 Henry입니다~

 

오늘은 프로그래머스 Level 2 문제 중에 최댓값과 최솟값이라는 문제를 풀어보았습니다.

 

왠지 프로그래머스 Level 2 문제 중 가장 쉬운 난이도를 가진 문제일 것 같은데요,

 

저는 정렬과 문자열 인덱싱을 사용하여 문제를 풀었습니다.

 

def solution(s: str) -> str:
    sorted_ls = sorted(s.split(' '), key=lambda x: int(x))
    return sorted_ls[0] + ' ' + sorted_ls[-1]

 

아래는 문제 풀이 영상입니다.

https://youtu.be/4IFhPzwipKA

 

반응형
반응형

 

안녕하세요 Henry입니다~

 

오늘은 프로그래머스의 Level 2 문제인 최솟값 만들기 문제를 풀어보았습니다.

 

이 문제의 핵심은 두 리스트의 값을 곱하여 최솟값이 나오게 하기 위해,

각 리스트의 최댓값과 최솟값을 각각 곱해주어야 한다는 아이디어에서 시작됩니다.

 

저는 sorted라는 파이썬의 내장함수를 사용하였습니다.

제가 문제를 푼 코드입니다.

from typing import List

def solution(A: List[int], B: List[int]) -> int:
    answer = 0
    A = sorted(A)
    B = sorted(B, reverse=True)
    length_of_list = len(A)
    for i in range(length_of_list):
        answer += A[i]*B[i]

    return answer

 

문제 풀이 영상입니다.

https://youtu.be/wfR2srFxxJU

 

- YouTube

 

www.youtube.com

 

반응형

+ Recent posts