실습 환경 - Google Colab
자주 활용되는 판다스 예제¶
In [47]:
# 학습 전 실행: csv파일 (data.csv) 생성
import pandas as pd
import numpy as np
data = {
"메뉴":['아메리카노','카페라떼','카페모카', '바닐라라떼', '녹차', '초코라떼', '바닐라콜드브루'],
"가격":[4100, 4600, 4600, 5100, 4100, 5000, 5100],
"할인율":[0.5, 0.1, 0.2, 0.3, 0, 0, 0],
"칼로리":[10, 180, 420, 320, 20, 500, 400],
"원두":['콜롬비아', np.NaN, '과테말라', np.NaN, '한국', '콜롬비아', np.NaN],
"이벤트가":[1900, 2300, np.NaN, 2600, np.NaN, 3000, 3200],
}
data = pd.DataFrame(data)
data.to_csv('data.csv', index=False)
In [48]:
# 데이터 불러오기
df = pd.read_csv('data.csv')
df
Out[48]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | NaN | 3200.0 |
조건필터¶
In [49]:
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 7 entries, 0 to 6 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 메뉴 7 non-null object 1 가격 7 non-null int64 2 할인율 7 non-null float64 3 칼로리 7 non-null int64 4 원두 4 non-null object 5 이벤트가 5 non-null float64 dtypes: float64(2), int64(2), object(2) memory usage: 464.0+ bytes
In [50]:
# 조건 1개
# 할인율 > 0.2
df[df['할인율'] > 0.2]
Out[50]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
In [51]:
cond = df['할인율'] > 0.2
df[cond]
Out[51]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
In [52]:
# 조건 2개 이상 - AND
# 할인율 >= 0.2
# 칼로리 < 400
df[(df['할인율'] >= 0.2 ) & (df['칼로리'] < 400)]
Out[52]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
In [53]:
cond1 = df['할인율'] >= 0.2
cond2 = df['칼로리'] < 400
df[cond1 & cond2]
Out[53]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
In [54]:
# 조건 2개 이상 - OR
# 할인율 >= 0.2
# 칼로리 < 400
df[(df['할인율'] >= 0.2 ) | (df['칼로리'] < 400)]
Out[54]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
In [55]:
cond1 = df['할인율'] >= 0.2
cond2 = df['칼로리'] < 400
df[cond1 | cond2]
Out[55]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
In [56]:
# 문자열
# 원두 == 콜롬비아
df[df['원두']=='콜롬비아']
Out[56]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
In [57]:
cond = df['원두'] == '콜롬비아'
df[cond]
Out[57]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
In [58]:
# 문자열 숫자 - AND
# 원두 == 콜롬비아
# 가격 < 4500
df[(df['원두'] == '콜롬비아') & (df['가격'] < 4500)]
Out[58]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
In [59]:
cond1 = df['원두'] == '콜롬비아'
cond2 = df['가격'] < 4500
df[cond1 & cond2]
Out[59]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
결측치¶
- 결측값 NaN
- isnull()
- 결측치 갯수 : df.isnull().sum()
- 결측값 채우기 : fillna()
In [60]:
df
Out[60]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | NaN | 3200.0 |
In [61]:
# 컬럼별 결측치 확인
df.isnull()
Out[61]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | False | False | False | False | False | False |
1 | False | False | False | False | True | False |
2 | False | False | False | False | False | True |
3 | False | False | False | False | True | False |
4 | False | False | False | False | False | True |
5 | False | False | False | False | False | False |
6 | False | False | False | False | True | False |
In [62]:
df.isnull().sum()
Out[62]:
메뉴 0 가격 0 할인율 0 칼로리 0 원두 3 이벤트가 2 dtype: int64
In [63]:
# 결측값 채우기 - fillna()
# 원두 -> 코스타리카
df['원두'] = df['원두'].fillna('코스타리카')
df
Out[63]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 코스타리카 | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 3200.0 |
In [64]:
# 이벤트가 컬럼 결측치 1900으로 채우기
df['이벤트가'] = df['이벤트가'].fillna(1900)
df
Out[64]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 코스타리카 | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 3200.0 |
값 변경¶
- replace(변경 전, 변경 후)
- replace({변경 전: 변경 후})
- loc[] 사용
In [65]:
df
Out[65]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 코스타리카 | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 3200.0 |
In [66]:
# 문자 변경
# 아메리카노 -> 룽고
# 녹차 -> 그린티
df.replace('아메리카노', '룽고').replace('녹차', '그린티')
Out[66]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 룽고 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 코스타리카 | 2600.0 |
4 | 그린티 | 4100 | 0.0 | 20 | 한국 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 3200.0 |
In [71]:
d = {
'아메리카노': '룽고',
'녹차': '그린티'
}
df = df.replace(d)
In [72]:
df
Out[72]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 룽고 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 코스타리카 | 2600.0 |
4 | 그린티 | 4100 | 0.0 | 20 | 한국 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 3200.0 |
In [73]:
# 숫자 변경
# 1900 -> 1500
df = df.replace(1900, 1500)
df
Out[73]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 룽고 | 4100 | 0.5 | 10 | 콜롬비아 | 1500.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1500.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 코스타리카 | 2600.0 |
4 | 그린티 | 4100 | 0.0 | 20 | 한국 | 1500.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 3200.0 |
In [77]:
# loc로 값 변경
# 바닐라라떼 원두 -> 과테말라
df.loc[3, '원두'] = '과테말라'
df
Out[77]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 룽고 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 과테말라 | 2600.0 |
4 | 그린티 | 4100 | 0.0 | 20 | 한국 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 3200.0 |
In [78]:
# 이벤트가 전체 1000으로 변경
df.loc[:, '이벤트가'] = 1000
df
Out[78]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 룽고 | 4100 | 0.5 | 10 | 콜롬비아 | 1000.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 코스타리카 | 1000.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1000.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 과테말라 | 1000.0 |
4 | 그린티 | 4100 | 0.0 | 20 | 한국 | 1000.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 1000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 코스타리카 | 1000.0 |
내장함수¶
- 카운트 : count()
- 데이터 수 : len(df), df.shape
- 최대값 : df['컬럼명'].max()
- 최소값 : df['컬럼명'].min()
- 평균 : df['컬럼명'].mean()
- 중앙값 : df['컬럼명'].median()
- 합계 : df['컬럼명'].sum()
- 표준편차 : df['컬럼명'].std()
- 분산 : df['컬럼명'].var()
- 왜도 skewness : df['컬럼명'].skew()
- 첨도 kurtosis : df['컬럼명'].kurt()
- 백분위수 : df['컬럼명'].describe()
- 하위 25% : df['컬럼명'].quantile(.25)
- 상위 25% : df['컬럼명'].quantile(.75)
- 하위 25% 데이터 : df['컬럼명'].quantile(.25) > df['컬럼명']
- 상위 25% 데이터 : df['컬럼명'].quantile(.75) < df['컬럼명']
- 최빈값 : df['컬럼명'].mode()[0]
- apply()
In [80]:
# 데이터 불러오기
df = pd.read_csv('data.csv')
df
Out[80]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | NaN | 3200.0 |
In [82]:
# 카운트 - 컬럼
# default axis=0
# 결측치가 있으면 카운트에서 제외
df.count()
Out[82]:
메뉴 7 가격 7 할인율 7 칼로리 7 원두 4 이벤트가 5 dtype: int64
In [83]:
# 카운트 - 행
df.count(axis=1)
Out[83]:
0 6 1 5 2 5 3 5 4 5 5 6 6 5 dtype: int64
In [84]:
# 데이터 수 - len
len(df)
Out[84]:
7
In [86]:
# 데이터 수 - shape
df.shape
Out[86]:
(7, 6)
In [87]:
df.shape[0]
Out[87]:
7
In [89]:
# 최대값
df['가격'].max()
Out[89]:
5100
In [90]:
# 최소값
df['가격'].min()
Out[90]:
4100
In [91]:
# 평균
df['가격'].mean()
Out[91]:
4657.142857142857
In [92]:
# 중앙값
df['가격'].median()
Out[92]:
4600.0
In [94]:
# 합계
df['가격'].sum()
Out[94]:
32600
In [93]:
# 표준편차
df['가격'].std()
Out[93]:
435.3433237386437
In [96]:
# 분산
df['가격'].var()
Out[96]:
189523.8095238095
In [97]:
# 왜도 skewness
df['가격'].skew()
Out[97]:
-0.3739900475641664
In [99]:
# 첨도 kurtosis
df['가격'].kurt()
Out[99]:
-1.7170778515694067
In [100]:
# 백분위수
df.describe()
Out[100]:
가격 | 할인율 | 칼로리 | 이벤트가 | |
---|---|---|---|---|
count | 7.000000 | 7.000000 | 7.000000 | 5.000000 |
mean | 4657.142857 | 0.157143 | 264.285714 | 2600.000000 |
std | 435.343324 | 0.190238 | 196.965068 | 524.404424 |
min | 4100.000000 | 0.000000 | 10.000000 | 1900.000000 |
25% | 4350.000000 | 0.000000 | 100.000000 | 2300.000000 |
50% | 4600.000000 | 0.100000 | 320.000000 | 2600.000000 |
75% | 5050.000000 | 0.250000 | 410.000000 | 3000.000000 |
max | 5100.000000 | 0.500000 | 500.000000 | 3200.000000 |
In [101]:
df['가격'].describe()
Out[101]:
count 7.000000 mean 4657.142857 std 435.343324 min 4100.000000 25% 4350.000000 50% 4600.000000 75% 5050.000000 max 5100.000000 Name: 가격, dtype: float64
In [104]:
# 하위 25%
df['가격'].quantile(0.25)
Out[104]:
4350.0
In [105]:
df['가격'].quantile(.25)
Out[105]:
4350.0
In [106]:
# 상위 25%
df['가격'].quantile(0.75)
Out[106]:
5050.0
In [111]:
df['가격'].quantile(.75)
Out[111]:
5050.0
In [115]:
# 하위 25% 데이터
cond = df['가격'].quantile(.25) > df['가격']
df[cond]
Out[115]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
In [113]:
# 상위 25% 데이터
cond = df['가격'].quantile(.75) > df['가격']
df[cond]
Out[113]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
In [116]:
# 최빈값
df['원두'].mode()
Out[116]:
0 콜롬비아 Name: 원두, dtype: object
In [118]:
# 시리즈 형태로 출력
type(df['원두'].mode())
Out[118]:
pandas.core.series.Series
def __init__(data=None, index=None, dtype: Dtype | None=None, name=None, copy: bool | None=None, fastpath: bool=False) -> None
One-dimensional ndarray with axis labels (including time series). Labels need not be unique but must be a hashable type. The object supports both integer- and label-based indexing and provides a host of methods for performing operations involving the index. Statistical methods from ndarray have been overridden to automatically exclude missing data (currently represented as NaN). Operations between Series (+, -, /, \*, \*\*) align values based on their associated index values-- they need not be the same length. The result index will be the sorted union of the two indexes. Parameters ---------- data : array-like, Iterable, dict, or scalar value Contains data stored in Series. If data is a dict, argument order is maintained. index : array-like or Index (1d) Values must be hashable and have the same length as `data`. Non-unique index values are allowed. Will default to RangeIndex (0, 1, 2, ..., n) if not provided. If data is dict-like and index is None, then the keys in the data are used as the index. If the index is not None, the resulting Series is reindexed with the index values. dtype : str, numpy.dtype, or ExtensionDtype, optional Data type for the output Series. If not specified, this will be inferred from `data`. See the :ref:`user guide <basics.dtypes>` for more usages. name : Hashable, default None The name to give to the Series. copy : bool, default False Copy input data. Only affects Series or 1d ndarray input. See examples. Notes ----- Please reference the :ref:`User Guide <basics.series>` for more information. Examples -------- Constructing Series from a dictionary with an Index specified >>> d = {'a': 1, 'b': 2, 'c': 3} >>> ser = pd.Series(data=d, index=['a', 'b', 'c']) >>> ser a 1 b 2 c 3 dtype: int64 The keys of the dictionary match with the Index values, hence the Index values have no effect. >>> d = {'a': 1, 'b': 2, 'c': 3} >>> ser = pd.Series(data=d, index=['x', 'y', 'z']) >>> ser x NaN y NaN z NaN dtype: float64 Note that the Index is first build with the keys from the dictionary. After this the Series is reindexed with the given Index values, hence we get all NaN as a result. Constructing Series from a list with `copy=False`. >>> r = [1, 2] >>> ser = pd.Series(r, copy=False) >>> ser.iloc[0] = 999 >>> r [1, 2] >>> ser 0 999 1 2 dtype: int64 Due to input data type the Series has a `copy` of the original data even though `copy=False`, so the data is unchanged. Constructing Series from a 1d ndarray with `copy=False`. >>> r = np.array([1, 2]) >>> ser = pd.Series(r, copy=False) >>> ser.iloc[0] = 999 >>> r array([999, 2]) >>> ser 0 999 1 2 dtype: int64 Due to input data type the Series has a `view` on the original data, so the data is changed as well.
In [119]:
df['원두'].mode()[0]
Out[119]:
'콜롬비아'
In [120]:
# apply()
df
Out[120]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | NaN | 3200.0 |
In [121]:
def cal(x):
if x >= 300:
return "No"
else:
return "Yes"
df['칼로리'].apply(cal)
Out[121]:
0 Yes 1 Yes 2 No 3 No 4 Yes 5 No 6 No Name: 칼로리, dtype: object
In [122]:
# apply() 적용하여 새로운 컬럼 생성
df['먹어도되는지'] = df['칼로리'].apply(cal)
df
Out[122]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | 먹어도되는지 | |
---|---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 | Yes |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 | Yes |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN | No |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 | No |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN | Yes |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 | No |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | NaN | 3200.0 | No |
그룹핑¶
- df.groupby('컬럼명')
- df.groupby(['컬럼명', '컬럼명'])
In [127]:
# 원두 기준, 평균
# 코랩에서 판다스 버전이 업데이트되어 일부 함수에 `numeric_only=True` 를 설정해야 함
# 데이터프레임에서 숫자 형태의 데이터만 선택하도록 지정 (시험환경 버전은 설정 필요 없음)
# df.groupby('원두').mean()
df.groupby('원두').mean(numeric_only=True)
Out[127]:
가격 | 할인율 | 칼로리 | 이벤트가 | |
---|---|---|---|---|
원두 | ||||
과테말라 | 4600.0 | 0.20 | 420.0 | NaN |
콜롬비아 | 4550.0 | 0.25 | 255.0 | 2450.0 |
한국 | 4100.0 | 0.00 | 20.0 | NaN |
In [130]:
# 원두와 할인율 기준, 평균
df.groupby(['원두', '할인율']).mean(numeric_only=True)
Out[130]:
가격 | 칼로리 | 이벤트가 | ||
---|---|---|---|---|
원두 | 할인율 | |||
과테말라 | 0.2 | 4600.0 | 420.0 | NaN |
콜롬비아 | 0.0 | 5000.0 | 500.0 | 3000.0 |
0.5 | 4100.0 | 10.0 | 1900.0 | |
한국 | 0.0 | 4100.0 | 20.0 | NaN |
In [131]:
# 원두와 할인율 기준, 가격 평균
df.groupby(['원두', '할인율'])['가격'].mean(numeric_only=True)
Out[131]:
원두 할인율 과테말라 0.2 4600.0 콜롬비아 0.0 5000.0 0.5 4100.0 한국 0.0 4100.0 Name: 가격, dtype: float64
In [132]:
# 원두와 할인율 기준, 가격 평균 -> 데이터 프레임 형태
pd.DataFrame(df.groupby(['원두', '할인율'])['가격'].mean(numeric_only=True))
Out[132]:
가격 | ||
---|---|---|
원두 | 할인율 | |
과테말라 | 0.2 | 4600.0 |
콜롬비아 | 0.0 | 5000.0 |
0.5 | 4100.0 | |
한국 | 0.0 | 4100.0 |
In [134]:
# 1개 인덱스 형태로 리셋
df.groupby(['원두', '할인율']).mean(numeric_only=True).reset_index()
Out[134]:
원두 | 할인율 | 가격 | 칼로리 | 이벤트가 | |
---|---|---|---|---|---|
0 | 과테말라 | 0.2 | 4600.0 | 420.0 | NaN |
1 | 콜롬비아 | 0.0 | 5000.0 | 500.0 | 3000.0 |
2 | 콜롬비아 | 0.5 | 4100.0 | 10.0 | 1900.0 |
3 | 한국 | 0.0 | 4100.0 | 20.0 | NaN |
Quiz¶
In [144]:
# 데이터 불러오기
df = pd.read_csv('data.csv')
df
Out[144]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | NaN | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | NaN |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | NaN | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | NaN |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | NaN | 3200.0 |
In [2]:
# 1. '이벤트가' 컬럼 결측치는 이벤트가격 데이터 중 최소값으로 결측치 채움
In [156]:
min_price = df['이벤트가'].min()
df['이벤트가'] = df['이벤트가'].fillna(min_price)
df
Out[156]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 콜롬비아 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 콜롬비아 | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 콜롬비아 | 3200.0 |
In [ ]:
# 2. '원두' 컬럼 결측치는 원두 데이터 중 최빈값으로 결측치 채움
In [150]:
df['원두'] = df['원두'].fillna(df['원두'].mode()[0])
df
Out[150]:
메뉴 | 가격 | 할인율 | 칼로리 | 원두 | 이벤트가 | |
---|---|---|---|---|---|---|
0 | 아메리카노 | 4100 | 0.5 | 10 | 콜롬비아 | 1900.0 |
1 | 카페라떼 | 4600 | 0.1 | 180 | 콜롬비아 | 2300.0 |
2 | 카페모카 | 4600 | 0.2 | 420 | 과테말라 | 1900.0 |
3 | 바닐라라떼 | 5100 | 0.3 | 320 | 콜롬비아 | 2600.0 |
4 | 녹차 | 4100 | 0.0 | 20 | 한국 | 1900.0 |
5 | 초코라떼 | 5000 | 0.0 | 500 | 콜롬비아 | 3000.0 |
6 | 바닐라콜드브루 | 5100 | 0.0 | 400 | 콜롬비아 | 3200.0 |
In [3]:
# 3. 가격이 5000 이상인 데이터의 수를 구하시오
In [160]:
cond = df['가격'] >= 5000
len(df[cond])
Out[160]:
3
참고
[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3) | 퇴근후딴짓 - 인프런
퇴근후딴짓 | 비전공자, 입문자가 빅데이터 분석기사 실기를 빠르게 취득할 수 있도록 안내해드려요! 꼭 필요한 파이썬, 판다스, 머신러닝을 다루고 있어요!, ❤️공지❤️ 7회 기출 유형 업데이
www.inflearn.com
'자격증 > 빅데이터분석기사' 카테고리의 다른 글
[빅데이터분석기사] 작업형1 - 시계열 데이터 2 (0) | 2024.06.10 |
---|---|
[빅데이터분석기사] 작업형1 - 시계열 데이터 1 (0) | 2024.06.10 |
[빅데이터분석기사] 작업형1 - 판다스 기초 2 (0) | 2024.06.10 |
[빅데이터분석기사] 작업형 1 - 판다스 기초 1 (0) | 2024.06.10 |
[빅데이터분석기사/실기] 01. 데이터 전처리 1 (2) | 2023.11.26 |