언어/파이썬

머신러닝with파이썬3강(5)_그룹핑, apply함수

디지털랫드 2024. 3. 6. 12:37

그룹핑


이번 시간에는 그룹핑에 대하여 설명해 드리도록 하겠습니다.

이번 시간 정리


1. 1개 컬럼 기준, 평균값 확인

  • df.groupby('기준 컬럼명').mean()

2. 다수 컬럼 기준, 평균값 확인

  • df.groupby(['기준 컬럼명1', '기준 컬럼명 2']).mean()

이제 아래의 코드 실행 버튼을 눌러 실습을 진행해 보세요!

 
 
실행 완료
[63]:
가격칼로리할인율할인가원산지국내산브라질
13128.571429 1328.571429 0.25 10133.333333
14500.000000 1400.000000 0.20 11600.000000
 
 
실행 완료
[64]:
가격칼로리할인가원산지할인율국내산0.20.5브라질0.2
13200.0 1420.0 10560.0
16000.0 1200.0 8000.0
14500.0 1400.0 11600.0

3. 원산지와 할인율 기준, 가격 평균 ->[시리즈 형태]

  • df.groupby(['기준 컬럼명1', '기준 컬럼명2'])['구하려는 컬럼'].mean()

4. 원산지와 할인율 기준, 가격 평균 ->[데이터프레임 형태1]

  • pd.DataFrame(df.groupby(['기준 컬럼명1', '기준 컬럼명2'])['구하려는 컬럼'].mean())

5.원산지와 할인율 기준, 가격 평균 -> [데이터프레임 형태2]

  • df.groupby(['기준 컬럼명1', '기준 컬럼명2'])[['구하려는 컬럼']].mean()

이제 아래의 코드 실행 버튼을 눌러 실습을 진행해 보세요!

 
 
실행 완료
[65]:
원산지  할인율
국내산  0.2    13200.0
     0.5    16000.0
브라질  0.2    14500.0
Name: 가격, dtype: float64
 
 
실행 완료
[69]:
가격원산지할인율국내산0.20.5브라질0.2
13200.0
16000.0
14500.0
 
 
실행 완료
[68]:
가격원산지할인율국내산0.20.5브라질0.2
13200.0
16000.0
14500.0

6. 원산지와 할인율 기준 최대값 확인

  • df.groupby(['기준 컬럼명1', '기준 컬럼명2']).max()

7. 1개의 인덱스 형태로 리셋

  • df.groupby(['기준 컬럼명1', '기준 컬럼명2']).max().reset_index()

이제 아래의 코드 실행 버튼을 눌러 실습을 진행해 보세요!

 
 
실행 완료
[66]:
Unnamed: 0메뉴가격호수칼로리할인가원산지할인율국내산0.20.5브라질0.2
6 황금후라이드 14000 9 1800.0 11200.0
new [인기]아이펠치킨 16000 11 1200.0 8000.0
5 파닭 15000 12 1500.0 12000.0
 
 
실행 완료
[67]:
원산지할인율Unnamed: 0메뉴가격호수칼로리할인가012
국내산 0.2 6 황금후라이드 14000 9 1800.0 11200.0
국내산 0.5 new [인기]아이펠치킨 16000 11 1200.0 8000.0
브라질 0.2 5 파닭 15000 12 1500.0 12000.0

 

apply 함수


이번 시간에는 apply 함수에 대하여 설명해 드리도록 하겠습니다.
이 apply 함수를 잘 사용하면 데이터 전 처리할 때 굉장히 유용하게 활용할 수 있다고 하니 잘 배워 두시기 바랍니다!

이번 시간 정리


1. apply() 메서드
-판다스 객체(pandas.DataFame.apply, pandas.Series.apply)에 열 혹은 행에 대해 함수를 적용

2.람다(Lambda) 표현식
-람다 표현식은 (때로 람다 형식(lambda forms)이라고 불립니다) 이름 없는 함수를 만드는 데 사용


이제 아래의 코드 실행 버튼을 눌러 실습을 진행해 보세요!

 
실행 완료
[75]:
Unnamed: 0메뉴가격호수칼로리할인율할인가원산지고민752341608
new [인기]아이펠치킨 16000 11 1200.0 0.5 8000.0 국내산 무조건먹자
5 닭강정 15000 12 1500.0 0.2 12000.0 브라질 먹지말자
2 간장치킨 14000 9 1600.0 0.2 11200.0 국내산 먹지말자
3 마늘치킨 14000 9 1800.0 0.2 11200.0 국내산 먹지말자
4 파닭 14000 11 1300.0 0.2 11200.0 브라질 먹지말자
1 승일양념치킨 13000 10 1400.0 0.2 10400.0 국내산 먹지말자
6 양념반후라이드반 13000 10 1300.0 0.2 10400.0 국내산 먹지말자
0 황금후라이드 12000 10 1000.0 0.2 9600.0 국내산 무조건먹자
10 [베스트]풀잎치킨 9900 10 1000.0 NaN NaN 국내산 무조건먹자
 
실행 완료
[74]:
7     no
5    yes
2    yes
3    yes
4    yes
1    yes
6    yes
0     no
8     no
Name: 칼로리, dtype: object
 
코드 실행
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
/tmp/ipykernel_13/670485884.py in <module>
      1 # apply 적용해서 새로운 컬럼 생성 (칼로리 컬럼 활용)
----> 2 df['살찔까요'] = df['칼로리'].apply(cal)
      3 df

NameError: name 'cal' is not defined
 
 
실행 완료
[72]:
Unnamed: 0메뉴가격호수칼로리할인율할인가원산지고민752341608
new [인기]아이펠치킨 16000 11 1200.0 0.5 8000.0 국내산 무조건먹자
5 닭강정 15000 12 1500.0 0.2 12000.0 브라질 먹지말자
2 간장치킨 14000 9 1600.0 0.2 11200.0 국내산 먹지말자
3 마늘치킨 14000 9 1800.0 0.2 11200.0 국내산 먹지말자
4 파닭 14000 11 1300.0 0.2 11200.0 브라질 먹지말자
1 승일양념치킨 13000 10 1400.0 0.2 10400.0 국내산 먹지말자
6 양념반후라이드반 13000 10 1300.0 0.2 10400.0 국내산 먹지말자
0 황금후라이드 12000 10 1000.0 0.2 9600.0 국내산 무조건먹자
10 [베스트]풀잎치킨 9900 10 1000.0 NaN NaN 국내산 무조건먹자
 
 
코드 실행
---------------------------------------------------------------------------
FileNotFoundError                         Traceback (most recent call last)
/tmp/ipykernel_13/3374916280.py in <module>
----> 1 pd.read_csv('final_modudak.csv')

/opt/conda/lib/python3.9/site-packages/pandas/util/_decorators.py in wrapper(*args, **kwargs)
    309                     stacklevel=stacklevel,
    310                 )
--> 311             return func(*args, **kwargs)
    312 
    313         return wrapper

/opt/conda/lib/python3.9/site-packages/pandas/io/parsers/readers.py in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)
    584     kwds.update(kwds_defaults)
    585 
--> 586     return _read(filepath_or_buffer, kwds)
    587 
    588 

/opt/conda/lib/python3.9/site-packages/pandas/io/parsers/readers.py in _read(filepath_or_buffer, kwds)
    480 
    481     # Create the parser.
--> 482     parser = TextFileReader(filepath_or_buffer, **kwds)
    483 
    484     if chunksize or iterator:

/opt/conda/lib/python3.9/site-packages/pandas/io/parsers/readers.py in __init__(self, f, engine, **kwds)
    809             self.options["has_index_names"] = kwds["has_index_names"]
    810 
--> 811         self._engine = self._make_engine(self.engine)
    812 
    813     def close(self):

/opt/conda/lib/python3.9/site-packages/pandas/io/parsers/readers.py in _make_engine(self, engine)
   1038             )
   1039         # error: Too many arguments for "ParserBase"
-> 1040         return mapping[engine](self.f, **self.options)  # type: ignore[call-arg]
   1041 
   1042     def _failover_to_python(self):

/opt/conda/lib/python3.9/site-packages/pandas/io/parsers/c_parser_wrapper.py in __init__(self, src, **kwds)
     49 
     50         # open handles
---> 51         self._open_handles(src, kwds)
     52         assert self.handles is not None
     53 

/opt/conda/lib/python3.9/site-packages/pandas/io/parsers/base_parser.py in _open_handles(self, src, kwds)
    220         Let the readers open IOHandles after they are done with their potential raises.
    221         """
--> 222         self.handles = get_handle(
    223             src,
    224             "r",

/opt/conda/lib/python3.9/site-packages/pandas/io/common.py in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
    700         if ioargs.encoding and "b" not in ioargs.mode:
    701             # Encoding
--> 702             handle = open(
    703                 handle,
    704                 ioargs.mode,

FileNotFoundError: [Errno 2] No such file or directory: 'final_modudak.csv'

데이터 핸들링 실습은 여기까지 하도록 하겠습니다. 고생 많으셨습니다.!!