pd.cut을 이용한 label 부여

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import LabelEncoder
plt.rc('font',family='Malgun Gothic')
df = pd.read_csv('../data/final_data.csv',encoding='cp949')
labels = ['좋음','보통','나쁨','매우나쁨']
SO2_bins = [(0,0.02),(0.021,0.05),(0.051,0.15),(0.151,1)]
CO_bins = [(0,2),(2.01,9),(9.01,15),(15.01,50)]
O3_bins = [(0,0.03),(0.031,0.09),(0.091,0.15),(0.151,0.6)]
NO2_bins = [(0,0.03),(0.031,0.06),(0.061,0.2),(0.201,2)]
PM10_bins = [(0,30),(31,80),(81,150),(151,600)]
PM25_bins = [(0,15),(16,35),(36,75),(76,500)]
#both는 bins의 양끝값을 모두 포함합니다.
#대기오염을 좋음 부터 매우 나쁨까지 label을 부여하기 위한 함수입니다.
def condition(series,new_name,bins,labels,closed='both'):
   #tuple로 interval을 만들어 줍니다
    _bins = pd.IntervalIndex.from_tuples(bins,closed='both')
    d = dict(zip(_bins,labels))
    #dictionary와 map 함수를 통해 기존 컬럼의 값들을 label로  변경해서 새로운 컬럼에 할당합니다.
    df[new_name] =pd.cut(series,_bins,include_lowest=True,).map(d)
    return df[new_name]
# NUll값 발생이유 -> 자리수가 안 맞음
# 해결을 위해 SO2,O3,NO2컬럼을 소수 세번째 자리까지 반올림
# PM10,PM25경우 일의 자리까지 반올림
# 함수 다시 적용
df[['SO2_round','O3_round','NO2_round']] = df[['SO2','O3','NO2']].round(3)
df[['PM10_round','PM25_round']] = df[['PM10','PM25']].round(0).astype('int')
condition(df['SO2_round'],'SO2_condition',SO2_bins,labels)
condition(df['CO'],'CO_condition',CO_bins,labels)
condition(df['O3_round'],'O3_condition',O3_bins,labels)
condition(df['NO2_round'],'NO2_condition',NO2_bins,labels)
condition(df['PM10_round'],'PM10_condition',PM10_bins,labels)
condition(df['PM25_round'],'PM25_condition',PM25_bins,labels)
0        보통
1        보통
2        보통
3        보통
4        보통
         ..
32860    좋음
32861    보통
32862    보통
32863    보통
32864    보통
Name: PM25_condition, Length: 32865, dtype: category
Categories (4, object): [좋음 < 보통 < 나쁨 < 매우나쁨]
df.columns
Index(['판매일시', '파종일시', '도_num', '연도', 'SO2', 'CO', 'O3', 'NO2', 'PM10', 'PM25',
       '합계 일조시간(hr)', '품종명', '도', '마켓명', '가격', 'SO2_condition', 'CO_condition',
       'O3_condition', 'NO2_condition', 'PM10_condition', 'PM25_condition'],
      dtype='object')
(df[['SO2_condition', 'CO_condition','O3_condition', 'NO2_condition', 'PM10_condition', 'PM25_condition']]) 
SO2_condition CO_condition O3_condition NO2_condition PM10_condition PM25_condition
0 좋음 좋음 좋음 좋음 보통 보통
1 좋음 좋음 좋음 보통 보통 보통
2 좋음 좋음 좋음 좋음 보통 보통
3 좋음 좋음 좋음 보통 보통 보통
4 좋음 좋음 좋음 좋음 보통 보통
... ... ... ... ... ... ...
32860 좋음 좋음 좋음 좋음 좋음 좋음
32861 좋음 좋음 좋음 좋음 좋음 보통
32862 좋음 좋음 좋음 좋음 보통 보통
32863 좋음 좋음 좋음 좋음 좋음 보통
32864 좋음 좋음 좋음 좋음 좋음 보통

32865 rows × 6 columns

df
판매일시 파종일시 도_num 연도 SO2 CO O3 NO2 PM10 PM25 ... 품종명 마켓명 가격 SO2_condition CO_condition O3_condition NO2_condition PM10_condition PM25_condition
0 2013-05-01 2013-01-01 0 2013 0.007216 0.770076 0.020583 0.018420 45.132576 31.543635 ... 토마토(10kg) 강원도 가락도매 -1.0 좋음 좋음 좋음 좋음 보통 보통
1 2013-05-01 2013-01-01 1 2013 0.006340 0.649199 0.013143 0.031923 44.532051 31.543635 ... 토마토(10kg) 경기도 가락도매 -1.0 좋음 좋음 좋음 보통 보통 보통
2 2013-05-01 2013-01-01 2 2013 0.007477 0.713492 0.013913 0.030154 39.626984 31.543635 ... 토마토(10kg) 인천광역시 가락도매 -1.0 좋음 좋음 좋음 좋음 보통 보통
3 2013-05-01 2013-01-01 3 2013 0.005741 0.658125 0.008458 0.043541 38.334375 31.543635 ... 토마토(10kg) 서울특별시 가락도매 -1.0 좋음 좋음 좋음 보통 보통 보통
4 2013-05-01 2013-01-01 4 2013 0.006363 0.739583 0.015653 0.017980 48.280093 31.543635 ... 토마토(10kg) 경상북도 북부도매 -1.0 좋음 좋음 좋음 좋음 보통 보통
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
32860 2019-04-30 2018-12-31 10 2018 0.003241 0.502206 0.018193 0.023311 22.787681 12.066176 ... 토마토(10kg) 울산광역시 엄궁도매 22000.0 좋음 좋음 좋음 좋음 좋음 좋음
32861 2019-04-30 2018-12-31 11 2018 0.003150 0.475868 0.017313 0.022639 29.648866 19.518839 ... 토마토(10kg) 경상남도 엄궁도매 22000.0 좋음 좋음 좋음 좋음 좋음 보통
32862 2019-04-30 2018-12-31 12 2018 0.003204 0.605093 0.015468 0.027125 34.759259 22.728704 ... 토마토(10kg) 광주광역시 각화도매 21000.0 좋음 좋음 좋음 좋음 보통 보통
32863 2019-04-30 2018-12-31 13 2018 0.004119 0.373418 0.014718 0.027532 28.525591 15.960829 ... 토마토(10kg) 부산광역시 엄궁도매 22000.0 좋음 좋음 좋음 좋음 좋음 보통
32864 2019-04-30 2018-12-31 14 2018 0.005988 0.594565 0.018808 0.015774 25.805264 20.055719 ... 토마토(10kg) 전라남도 각화도매 22000.0 좋음 좋음 좋음 좋음 좋음 보통

32865 rows × 21 columns

df.isnull().sum
<bound method DataFrame.sum of         판매일시   파종일시  도_num     연도    SO2     CO     O3    NO2   PM10   PM25  \
0      False  False  False  False  False  False  False  False  False  False   
1      False  False  False  False  False  False  False  False  False  False   
2      False  False  False  False  False  False  False  False  False  False   
3      False  False  False  False  False  False  False  False  False  False   
4      False  False  False  False  False  False  False  False  False  False   
...      ...    ...    ...    ...    ...    ...    ...    ...    ...    ...   
32860  False  False  False  False  False  False  False  False  False  False   
32861  False  False  False  False  False  False  False  False  False  False   
32862  False  False  False  False  False  False  False  False  False  False   
32863  False  False  False  False  False  False  False  False  False  False   
32864  False  False  False  False  False  False  False  False  False  False   

       ...  O3_round  NO2_round  PM10_round  PM25_round  SO2_condition  \
0      ...     False      False       False       False          False   
1      ...     False      False       False       False          False   
2      ...     False      False       False       False          False   
3      ...     False      False       False       False          False   
4      ...     False      False       False       False          False   
...    ...       ...        ...         ...         ...            ...   
32860  ...     False      False       False       False          False   
32861  ...     False      False       False       False          False   
32862  ...     False      False       False       False          False   
32863  ...     False      False       False       False          False   
32864  ...     False      False       False       False          False   

       CO_condition  O3_condition  NO2_condition  PM10_condition  \
0             False         False          False           False   
1             False         False          False           False   
2             False         False          False           False   
3             False         False          False           False   
4             False         False          False           False   
...             ...           ...            ...             ...   
32860         False         False          False           False   
32861         False         False          False           False   
32862         False         False          False           False   
32863         False         False          False           False   
32864         False         False          False           False   

       PM25_condition  
0               False  
1               False  
2               False  
3               False  
4               False  
...               ...  
32860           False  
32861           False  
32862           False  
32863           False  
32864           False  

[32865 rows x 26 columns]>
df.drop(['SO2_round','O3_round','NO2_round','PM10_round','PM25_round'],axis=1,inplace=True)