Daily/TIL

[TIL.v1] 25/03/22~23

기븜 2025. 3. 22. 23:26
< TIL 반드시 들어가야 할 내용 >
1. 문제: 어떤 문제가 있었는지
2. 시도: 내가 시도해 본 것들 (자세히 쓰기)
3. 해결: 어떻게 해결했는지
4. 배움: 뭘 새롭게 알았는지 (자세히 쓰기)

주말 날씨 최고네~~~

어제 TIL에 기재하려고 했으나 내용이 너무 길어져서 주말에 이어서 쓰는 공부기록~

# 배운 점

* lambda함수 복습

- 정의: Python에서 사용하는 익명함수(이름 없는 함수). 일반 함수와 달리 한 줄로 간단히 작성 가능

- 설명: 함수 간단 정의를 통해 코드 길이를 줄이고 주로 간단계산 및 데이터 처리에 사용

- 특징

lambda 키워드 사용으로 정의. 매개변수와 표현식만 포함

여러줄로 작성할 수 없고 단일 식만 보유 가능

- 함수 사용시 필요사항

함수 간결화: 간단한 코드 or 일회성 사용 시 적합

단일식 표현: 복잡한 로직보다 간단 계산이나 처리를 수행할 때 사용

이름 없는 함수: 굳이 함수 이름을 정의하지 않고도 사용 가능

- 예시

1) 리스트 정렬

# 이름의 길이를 기준으로 정렬
names = ["Joy", "Michael", "Anna"]
names.sort(key=lambda name: len(name))
print(names)  # 출력: ['Joy', 'Anna', 'Michael']

2) 필터링

# 짝수만 필터링
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # 출력: [2, 4, 6]

3) 맵(Map)함수와 사용 (아래에 추가설명)

# 리스트의 각 요소 제곱
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, numbers))
print(squared)  # 출력: [1, 4, 9, 16]

4) 추가예제

# 두 숫자를 더하는 lambda 함수
add = lambda x, y: x + y
result = add(5, 3)
print(result)  # 출력: 8

 

* Mapping과 Grouping의 차이점 알아보기

1) Mapping 맵핑

- 정의: 데이터의 각 요소를 특정 규칙에 따라 변환 or 대응시키는 과정

- 설명: 리스트, 딕셔너리, 기타 데이터 구조에서 각 요소에 변환 규칙을 적용하는 작업

- 특징: 원본 데이터를 유지하면서 변환된 데이터를 생성 / map() 함수는 함수형 프로그래밍에서 주로 사용

- 예시:

# 리스트의 각 요소를 제곱으로 변환
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, numbers))
print(squared)  # 출력: [1, 4, 9, 16]

 

2) Grouping 그룹핑

- 정의: 데이터를 특정 기준에 따라 그룹으로 묶는 작업

- 설명: 비슷한 특성을 가진 데이터를 함께 모아 하나의 그룹으로 관리

- 특징: 데이터를 분류하거나 집계하는데 사용 / 데이터 분석과 통계 작업에서 유용

- 예시

from itertools import groupby # groupby는 리스트를 특정 키(첫 번째 값) 기준으로 그룹화

# 리스트를 기준 값으로 그룹핑
data = [("A", 1), ("A", 2), ("B", 3), ("B", 4), ("C", 5)]

# 그룹핑 함수
grouped_data = groupby(data, key=lambda x: x[0])

for key, group in grouped_data:
    print(f"그룹: {key}")
    print(f"값: {list(group)}")

 

3) 차이점 정리

Mapping Grouping
데이터를 변환 데이터를 분류
각 요소에 규칙을 적용 기준에 따라 데이터를 묶음

 

* 컴프리헨션(Comprehension) 으로 for문 한 줄로 작성하기!

- 정의: 리스트, 집합, 딕셔너리 등을 간결하고 휴율적으로 생성하는 Python 문법

- 특징

코드가 간단하고 가독성이 좋다

반복문과 조건문을 함꼐 사용할 수 있다

불필요한 변수를 줄여 코드의 효율성을 높일 수 있다

- 예시

# 1. 리스트의 각 요소를 2배로 만드는 리스트 컴프리헨션
# 기존 방식
numbers = [1, 2, 3, 4]
doubled = []
for num in numbers:
    doubled.append(num * 2)

# 리스트 컴프리헨션-> 사용시 코드를 한줄로 간단히 작성가능
doubled = [num * 2 for num in numbers]
print(doubled)  # 출력: [2, 4, 6, 8]

# 2. 숫자의 제곱을 키-값으로 저장하는 딕셔너리 컴프리헨션
numbers = [1, 2, 3, 4]
square_dict = {num: num ** 2 for num in numbers}
print(square_dict)  # 출력: {1: 1, 2: 4, 3: 9, 4: 16}

 

* Pandas에서 데이터 프레임 합치기: pd.merge() /Join메소드

 

- 정의: 데이터프레임(DataFrame)을 다른 데이터프레임과 인덱스 기준으로 병합(merge)

- 설명: 두 데이터프레임을 공통 열을 기준으로 합치고 SQL의 JOIN과 유사하게 작동함

- 특징

기본적으로 왼쪽 df의 인덱스 기준으로 병합

how? 매개변수를 사용해 병합 방식 설정 가능 (left, right, outer, inner)

열 이름이 겹칠 경우 접두사(prefix) 추가 가능

- 주요 매개변수

1) other: 병합할 다른 데이터프레임

2) how: 병합방식 (기본값: left)

(ㄱ) left

왼쪽 데이터프레임(df) 인덱스를 기준으로 병합

오른쪽 df 값은 필요시 추가됨. 해당 데이터가 없을 경우 NaN으로 채워짐

특징: 누락된 값을 최소화하기 위해 주로 사용

예시

result = df1.join(df2, how="left")

(ㄴ) right

오른쪽 데이터프레임의 인덱스를 기준으로 병합

왼쪽 df 값은 필요시 추가됨. 해당 데이터가 없을 경우 NaN으로 채워짐

특징: 오른쪽 df 기준으로 분석할 때 유용

예시

result = df1.join(df2, how="right")

 

(ㄷ) inner: 공통된 인덱스만 포함

공통된 인덱스만 병합

df간 공통 값이 없으면 결과 df 비어있을 수도 있음

특징: 필요한 데이터만 포함하므로 불필요한 데이터를 줄이는데 적합

예시

result = df1.join(df2, how="inner")

 

(ㄹ) outer: 양쪽 모두 포함

양쪽 df의 모든 인덱스를 포함. 공통되지 않은 값은 NaN으로 채워짐

특징: 누락된 데이터 없이 모든 정보를 포함하는데 사용

예시

result = df1.join(df2, how="outer")

 

(ㅁ) 시각적 예시 (병합 방식의 차이)

how 값 포함되는 데이터
left 왼쪽 df기준 + 오른쪽 값 (NaN 허용)
right 오른쪽 df기준 + 왼쪽 값 (NaN 허용)
inner 양쪽 df 공통된 인덱스
outer 양쪽 df 모든 인덱스 (NaN 허용)

 

(ㅂ) NaN 데이터 처리: 병합 후 누락된 데이터(NaN)를 처리하려면 다음과 같은 방법을 사용

fillna(): 누락된 데이터를 기본값으로 채우기

result = result.fillna("없음")

 

3) lsuffix / rsuffix: 열 이름 충돌 시 접두사 추가

참고자료출처: 블로그, docs

 

* inplace 사용 차이점

(1) inplace = True 이거 저장해줘

- 정의: 원본 데이터(df or 시리즈)를 직접 수정

- 특징: 수정된 결과를 별도로 반환하지 않으며 원본 데이터가 변경

- 사용목적: 데이터 변형 후 별도의 새로운 변수 미생성. 원본 데이터를 바로 업데이트할 때 사용

- 예시

# inplace = True는 원본 데이터를 변경하므로 별도의 복사본이 필요 없을 때 유용
import pandas as pd

# 데이터프레임 생성
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})

# 열 제거 (원본 수정)
df.drop("B", axis=1, inplace=True)
print(df)  # 출력: 원본 데이터에서 B 열이 제거됨

 

(2) inplace = False 이거 저장하지 말아 줘

- 정의: 원본 데이터는 그대로 유지. 수정된 결과를 반환

- 특징: 원본데이터는 수정되지X. 수정된 결과를 새로운 변수에 저장O

- 사용목적: 데이터를 여러단계로 변형 or 원본 데이터를 보존하면서 결과를 비교할때 사용

- 예시

# inplace=False는 원본 데이터를 보존하면서 변경된 결과를 별도로 저장
import pandas as pd

# 데이터프레임 생성
df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]})

# 열 제거 (원본 유지, 새로운 데이터 반환)
new_df = df.drop("B", axis=1, inplace=False)
print(new_df)  # 출력: B 열이 제거된 새로운 데이터프레임
print(df)      # 출력: 원본 데이터프레임은 그대로 유지됨

 

(3) 여기서 질문? inplace = False 저장하지 않는다면 왜 사용하는 거지?

(ㄱ) 원본 데이터 보존: 작업 중 원본 데이터를 유지하고 수정된 결과를 여러번 비교 or 복원 가능

(ㄴ) 유연성 제공: 결과를 변수에 저장하지 않아도 임시로 확인 or 특정 작업에 활용가능

df.drop("B", axis=1)  # 반환된 결과를 임시로 확인 (저장하지 않음)

(ㄷ) 코드 가독성: 반환값을 사용하지 않아도 원본 데이터를 변경하지 않으므로 결과를 반환하는 함수로서의 역할 명확히 전달

 

기타

일요일

* 부모님과 간만에 점심 먹으러 나가서 막국수, 만두, 메밀전  냠~

배불렀었는데 사진보니까 또 먹고 싶다

 

 

 

 

 

* 거울을 보다가... 갑자기 찾아온다는 앞머리의 유혹이 오래간만에 와서...

망설임 없이 가위 들고 잘라버림...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

정성 들여서 자른 게 아니라 그냥 기분 내려고 대충 자른 거라 엉망이었지만 나쁘지 않아~