레이블이 #python인 게시물을 표시합니다. 모든 게시물 표시
레이블이 #python인 게시물을 표시합니다. 모든 게시물 표시

2025년 8월 14일 목요일

[Python] Pandas Dataframe의 groupby & agg 메서드 (+ Dictinary 자료형 활용)

 groupby 메서드는 dataframe의 데이터를 그룹화해주고 agg 메서드는 그룹화된 데이터에 대해 집계함수를 적용해주는 메서드이다. 


집계 함수 종류는

mean (평균), sum (합계), count (개수), max (최대값), min (최소값), std (표준편차), var (분산)이 있다. 


일반적인 용법은

df.groupby('column_name').agg(agg_func)

여기서 column_name이 그룹화할 기준 컬럼이 되고 agg_func이 집계함수가 된다.


예시)

import pandas as pd


data = {

'category' : ['A', 'A', 'B', 'B', 'C', 'C'],

'value1' : [1,2,3,4,5,6],

'value2': [10,20,30,40,50,60]

}

df = pd.DataFrame(data)


grouped_df = df.groupby('category').agg({'value1':'mean', 'value2':'sum'})

print(grouped_df)


output:

category    value1    value2

A                1.5            30

B                3.5            70

C                5.5            110


groupby 메서드 & agg 메서드를 사용하여 'category' 컬럼을 기준으로 그룹화하고, 'value1', 'value2' 컬럼에 대해 각각 평균과 합계를 계산한 결과이다.


agg 매서드에 딕셔너리를 전달하면 각 컬럼에 대한 집계함수를 구할 수 있다.


예시 2) lambda 함수 활용

grouped_df = df.groupby('category').agg(lambda x : x.max() - x.min())

print(grouped_df)


이렇게 lambda함수를 활용하여 사용자 정의 집계 함수를 적용할 수도 있다. 


예시 3) 딕셔너리 unpacking

** 인자는 딕셔너리의 각 element를 전달할 때 사용한다. 즉 dictionary의 element들을 각각 분리하여 전달한다.


agg_dict = {'value1' : 'mean', 'value2' : 'sum'}

grouped_df = df.groupby('category').agg(**agg_dict)


이 때 위 예시에서 
grouped_df = df.groupby('category').agg({'value1':'mean', 'value2':'sum'})
이렇게 직접 agg매서드 내에 딕셔너리를 전달할 때는 dictionary로 전달이 가능하나

agg_dict처럼 dictionary를 변수로 받아 전달하는 경우 **를 붙여 dictionary unpack이 필요하다.
아닌 경우 아래와 같은 에러가 나타나게 되는데


TypeError: agg() missing 1 required positional argument: 'func'

이 에러는 agg매서드가 agg_dict딕셔너리를 함수로 인식하지 못하고, 대신 func라는 인자를 요구하게 된다. (... 잘은 이해는 안돼지만 그렇다고 한다).


예시 4) 딕셔너리 for문으로 정의하기

elements = ['value1', 'value2']

agg_dict = {col : 'mean' for col in elements}

딕셔너리 활용 예시인데 모든 column에 대한 집계함수를 mean으로 받고자 하면 위와같이 for문을 이용하여 dictionary를 정의할 수 있다.

이후

grouped_df = df.groupby('category').agg(**agg_dict)

하면 집계함수를 구할 수 있다. 

2025년 7월 19일 토요일

C# Dispose 매서드의 용도

아래와 같은 예시코드


public class MyComponent : Component

{

    protected override void Dispose(bool disposing)

    {

        if (disposing)

        {

            // 관리되는 리소스를 해제합니다.

        }

        // 관리되지 않는 리소스를 해제합니다.

        base.Dispose(disposing);

    }

}


프로그램 initialize 단계에서 위와 같은 코드가 들어간다. 이유는? 메모리 누수를 방지하기 위해.

메모리 누수란?
  • 메모리 누수(Memory Leak)는 프로그램이 더 이상 사용하지 않는 메모리를 해제하지 않아서 발생하는 문제입니다.
  • 메모리 누수가 발생하면 프로그램이 사용하는 메모리가 계속 증가하여 성능 저하, 심지어 프로그램이 종료될 수 있습니다.


좀 더 넓게 보면 1) Dispose 매서드는 실행하는데 필요한 리소스를 명시적으로 해제하며 메모리 누수도 방지하게 된다. 2) 추가로 컴포넌트의 라이프 사이클을 관리, 즉 객체의 생성, 사용, 해제를 관리하는 의미도 있다. 크게 보면 두 가지 목적이 있는 것.

리소스는 컴포넌트가 실행되는 동안 사용되는 시스템 자원을 일컫는데 예를들면,

- 메모리 : 컴포넌트가 사용하는 객체, 데이터 구조 등을 위해 할당되는 공간
- 파일 핸들 : 컴포넌트가 사용하는 파일, 스트림 등
- 네트워크 연결 : 컴포넌트가 사용하는 소켓, 네트워크 연결 등
- GDI (Graphic Device Interface, Windows 운영 체제에서 그래픽스 출력을 담당하는 API) 리소스 : 컴포넌트가 사용하는 그래픽스 장치 인터페이스 리소스 등

이 있다. 

관리되는 리소스와 관리되지 않는 리소스가 구분되는데 관리되는 리소스는 .NET 런타임에 의해 관리되는 리소스이다. 예를 들어, .NET 객체, 배열 등이 관리되는 리소스에 해당하고, 관리되지 않는 리소스는 반대로 .NET 런타임에 의해 관리되지 않는 리소스로, 예를들면 파일 핸들, 네트워크 연결, GDI 리소스 등이 관리되지 않는 리소스에 해당한다.


이러한 리소스 사이클 관리를 하는 dispose매서드를 파이썬에서 구현한다면 아래와 같이 객체 소멸자를 정의할 수 있다. 

import contextlib

class MyClass:
    def __init__(self):
        print("객체가 생성되었습니다.")

    def close(self):
        print("객체가 해제되었습니다.")

    def __del__(self):
        print("객체가 소멸되었습니다.")

with contextlib.closing(MyClass()) as obj:
    # 객체 사용
    pass


파이썬 프로그래밍에서도 이러한 리소스 관리가 필요할까? 










2022년 9월 25일 일요일

[Python 3.6] Anaconda 설치 후 가상환경 생성 / 기본 패키지 설치 (numpy / OpenCV 등 )

 Conda 가상환경 생성 / 제거

>conda create --name [Name] / conda remove --name [Name] --all

** 특정 python 버전 가상환경 생성인 경우

>conda create --name [Name] python=3.8 pip


Conda 가상환경 실행 /  종료

>conda activate [Name] / conda deactivate

 Conda 가상환경 패키지 확인 

>conda env list


가상환경 내 패키지 설치

> conda install [PackageName]

or PIP package 설치

>pip install [PackageName]


conda나 PiP 둘중 아무거나로 설치 진행

(코드 내 import된 패키지들 설치.)

eg)

>conda install numpy

혹은 

>pip install numpy

(패키지 설치시에는 구글링을 통해 특정 버전의 이슈가 있는지 확인해 보는게 좋다).


가상환경 패키지 update

>conda update -n base conda

>conda update --all

2020년 12월 18일 금요일

[Python 3.8.5] Tensorflow 설치 후 Runtime Error (Numpy installation fails to pass a sanity check)

문제 상황 : 

 Tensorflow 설치 후 정상 작동 확인 (version 확인)과정에서 아래와 같은 에러 발생


해결 과정 (링크 참조): 

https://developercommunity.visualstudio.com/content/problem/1207405/fmod-after-an-update-to-windows-2004-is-causing-a.html?page=1&pageSize=10&sort=votes&type=problem

  • pip list 확인시 numpy version 이 1.19.4 임을 확인

  • 에러 메시지에 나온 link에 제시된 solution 적용 (numpy 1.19.3 설치)
    pip uninstall numpy
    pip install numpy==1.19.3
  • 정상 작동 확인




2020년 11월 29일 일요일

[Python 3.8.5] Tensorflow 설치 후 import 에러 (DLL load failed)

 ** 참고 자료 (Reference) 

WEB, Git hub, TensorFlow,
"Win10: ImportError: DLL load failed: The specified module could not be found #22794"
URL : https://github.com/tensorflow/tensorflow/issues/22794

발생 경과 (Problem Description)

문제 (Problem)

After installation of Anaconda 3, python was executed on prompt window. Then thensorflow was imported as follow,
1
import tensorflow as tf
cs
Long error message occurred including 
"ImportError: DLL load failed: The specified module could not be found."

Anaconda 3 설치 후 Command창에서 python 실행
1
import tensorflow as tf
cs
실행시 아래와 같은 에러 메시지가 포함된 장문의 에러 발생
"ImportError: DLL load failed: The specified module could not be found."

해결 방법 (Solution)

Referring to Github/Tensorflow, "Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019" was installed : download link.
I have installed x64 version as same as my computer setting.

Github 내용 참조하여 "Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019" 설치
설치 download link, 아래 그림에서 내 컴퓨터 환경에 맞는 x64버전 설치 후 재부팅

경과 (Monitoring)

By checking tensorflow version, I have checked tensorflow was well imported.

이후 아래와 같은 warning은 발생하지만 제대로 tf로 import 된 것을 확인.