정리 노트

3일차(2022/07/06) 본문

[TIL]국민대X프로그래머스 여름방학 인공지능 과정

3일차(2022/07/06)

꿈만 꾸는 학부생 2022. 7. 6. 20:09
728x90

오늘은 다른 모듈 pandas에 대해 배웠습니다. numpy 모듈은 학과 시간에 살짝 다뤘던 경험이 있었지만 pandas 모듈은 처음 사용해본 것이기 때문에 배웠던 내용들의 거의 모든 것이 신기했습니다.

 

pandas로 데이터 다루기

1차원 데이터 - Series

Series는 1차원의 labled array입니다. 처음 이 정의를 접했을 때 '이게 리스트와 dict를 합친 건가?' 생각이 들었습니다.

Series는 기존 파이썬의 리스트와 dict를 가지고 생성할 수 있습니다.

>>> import pandas as pd
>>> s = pd.Series([1, 4, 9, 16, 25, 36])
>>> s
0     1
1     4
2     9
3    16
4    25
5    36
dtype: int64
>>> t = pd.Series({'one':1, 'two':2, 'three':3, 'four':4, 'five':5})
>>> t
one     1
two     2
three   3
four    4
five    5
dtype: int64

이 Series는 실제로 numpy.ndarray랑 파이썬의 dict와 유사하게 사용할 수 있습니다.

2차원 데이터 - dataframe

DataFrame은 2차원의 labled table입니다. DataFrame을 리스트를 이용해 생성할 수도 있지만 dict을 이용하는 게 더 편합니다.

>>> import pandas as pd
>>> info = {'grade': ['A', 'B', 'C', 'D', 'F'], 'min_score': [90, 80, 70, 60, 0]}
>>> info
{'grade': ['A', 'B', 'C', 'D', 'F'], 'min_score': [90, 80, 70, 60, 0]}
>>> df = pd.DataFrame(info)
>>> df
  grade  min_score
0     A         90
1     B         80
2     C         70
3     D         60
4     F          0

CSV 파일을 DataFrame으로

실제로 많은 곳에서 CSV 형식을 사용하고 있습니다. pandas는 이 CSV 파일을 읽어올 수 있는 함수를 제공합니다. 밑의 예시에서 사용하는 CSV 파일은 아래의 사이트에서 다운로드를 하였습니다.

https://www.kaggle.com/datasets/neuromusic/avocado-prices

 

Avocado Prices

Historical data on avocado prices and sales volume in multiple US markets

www.kaggle.com

>>> avocado = pd.read_csv("/home/user/다운로드/archive/avocado.csv")
>>> avocado
       Unnamed: 0        Date  AveragePrice  Total Volume     4046       4225    4770  Total Bags  Small Bags  Large Bags  XLarge Bags          type  year            region
0               0  2015-12-27          1.33      64236.62  1036.74   54454.85   48.16     8696.87     8603.62       93.25          0.0  conventional  2015            Albany
1               1  2015-12-20          1.35      54876.98   674.28   44638.81   58.33     9505.56     9408.07       97.49          0.0  conventional  2015            Albany
2               2  2015-12-13          0.93     118220.22   794.70  109149.67  130.50     8145.35     8042.21      103.14          0.0  conventional  2015            Albany
3               3  2015-12-06          1.08      78992.15  1132.00   71976.41   72.58     5811.16     5677.40      133.76          0.0  conventional  2015            Albany
4               4  2015-11-29          1.28      51039.60   941.48   43838.39   75.78     6183.95     5986.26      197.69          0.0  conventional  2015            Albany
...           ...         ...           ...           ...      ...        ...     ...         ...         ...         ...          ...           ...   ...               ...
18244           7  2018-02-04          1.63      17074.83  2046.96    1529.20    0.00    13498.67    13066.82      431.85          0.0       organic  2018  WestTexNewMexico
18245           8  2018-01-28          1.71      13888.04  1191.70    3431.50    0.00     9264.84     8940.04      324.80          0.0       organic  2018  WestTexNewMexico
18246           9  2018-01-21          1.87      13766.76  1191.92    2452.79  727.94     9394.11     9351.80       42.31          0.0       organic  2018  WestTexNewMexico
18247          10  2018-01-14          1.93      16205.22  1527.63    2981.04  727.01    10969.54    10919.54       50.00          0.0       organic  2018  WestTexNewMexico
18248          11  2018-01-07          1.62      17489.58  2894.77    2356.13  224.53    12014.15    11988.14       26.01          0.0       organic  2018  WestTexNewMexico

[18249 rows x 14 columns]

Pandas로 CSV 파일 갖고 놀기

pandas에서는 이 CSV 파일을 이리저리 다룰 수 있도록 여러 함수들을 제공합니다. 여기서 소개하는 함수는 일단 3개만 소개합니다.

함수 설명
head(n) 처음 n개의 데이터를 참조
tail(n) 마지막 n개의 데이터를 참조
groupby(by=dataframe['column_name']) dataframe의 'column_name'을 기준으로 묶는 함수(SQL의 GROUP BY와 유사)

사실 groupby 함수 같은 경우는 여러 단계를 거쳐야 합니다. groupby 함수를 통해 반환되는 것은 기준 컬럼을 기준으로 나눠지기만 한 객체이지 통계 함수까지 적용된 객체가 아니기 때문입니다. 따라서 눈에 보이는 출력물을 얻으려면 통계 함수를 사용해야 합니다.(sum(), mean(), median() 등...)

>>> avocado['Total Bags'].groupby(by=avocado['region'])
<pandas.core.groupby.generic.SeriesGroupBy object at 0x7fa5dce805b0>
>>> avocado['Total Bags'].groupby(by=avocado['region']).mean()
region
Albany                 7.929747e+03
Atlanta                8.449856e+04
BaltimoreWashington    1.044561e+05
Boise                  1.597459e+04
Boston                 6.359609e+04
...                    ...
Syracuse               1.240363e+04
Tampa                  5.768252e+04
TotalUS                4.847931e+06
West                   1.086017e+06
WestTexNewMexico       1.053627e+05
Name: Total Bags, dtype: float64

내용이 너무 많아서 제가 임의로 중략했지, 실제로 실행하면 모든 결과가 다 출력됩니다.

특정 컬럼의 모든 정보를 조회하려면 dataframe['column_name'] 또는 dataframe.column_name 형식으로 접근할 수 있습니다.

특정 열의 모든 정보를 조회하려면 dataframe.loc[row, col] 형식으로 접근할 수 있습니다. 만약 row, col을 숫자 인덱스로 사용하고 싶은 경우, dataframe.iloc[row_idx, col_idx] 형식으로 사용하면 됩니다.

>>> avocado['year']
0        2015
1        2015
2        2015
3        2015
4        2015
         ... 
18244    2018
18245    2018
18246    2018
18247    2018
18248    2018
Name: year, Length: 18249, dtype: int64
>>> avocado.loc[7]
Unnamed: 0                 7
Date              2015-11-08
AveragePrice            0.98
Total Volume       109428.33
4046                  703.75
4225               101815.36
4770                    80.0
Total Bags           6829.22
Small Bags           6266.85
Large Bags            562.37
XLarge Bags              0.0
type            conventional
year                    2015
region                Albany
Name: 7, dtype: object
>>> avocado.loc[7, 'AveragePrice']
0.98
>>> avocado.iloc[7, 2]
0.98

물론 데이터에 접근할 때 인덱스만이 아닌 조건을 이용해서 접근할 수도 있습니다.

>>> avocado['AveragePrice'] > 1.3
0         True
1         True
2        False
3        False
4        False
         ...  
18244     True
18245     True
18246     True
18247     True
18248     True
Name: AveragePrice, Length: 18249, dtype: bool
>>> avocado[avocado['AveragePrice'] > 1.3]
       Unnamed: 0        Date  AveragePrice  Total Volume     4046      4225    4770  Total Bags  Small Bags  Large Bags  XLarge Bags          type  year            region
0               0  2015-12-27          1.33      64236.62  1036.74  54454.85   48.16     8696.87     8603.62       93.25          0.0  conventional  2015            Albany
1               1  2015-12-20          1.35      54876.98   674.28  44638.81   58.33     9505.56     9408.07       97.49          0.0  conventional  2015            Albany
12             12  2015-10-04          1.31      61007.10  2268.32  49880.67  101.36     8756.75     8379.98      376.77          0.0  conventional  2015            Albany
14             14  2015-09-20          1.33      69759.01  1028.03  59313.12  150.50     9267.36     8489.10      778.26          0.0  conventional  2015            Albany
18             18  2015-08-23          1.34      79992.09   733.16  67933.79  444.78    10880.36    10745.79      134.57          0.0  conventional  2015            Albany
...           ...         ...           ...           ...      ...       ...     ...         ...         ...         ...          ...           ...   ...               ...
18244           7  2018-02-04          1.63      17074.83  2046.96   1529.20    0.00    13498.67    13066.82      431.85          0.0       organic  2018  WestTexNewMexico
18245           8  2018-01-28          1.71      13888.04  1191.70   3431.50    0.00     9264.84     8940.04      324.80          0.0       organic  2018  WestTexNewMexico
18246           9  2018-01-21          1.87      13766.76  1191.92   2452.79  727.94     9394.11     9351.80       42.31          0.0       organic  2018  WestTexNewMexico
18247          10  2018-01-14          1.93      16205.22  1527.63   2981.04  727.01    10969.54    10919.54       50.00          0.0       organic  2018  WestTexNewMexico
18248          11  2018-01-07          1.62      17489.58  2894.77   2356.13  224.53    12014.15    11988.14       26.01          0.0       organic  2018  WestTexNewMexico

[10173 rows x 14 columns]

 

728x90

'[TIL]국민대X프로그래머스 여름방학 인공지능 과정' 카테고리의 다른 글

6일 차(2022/07/11)  (0) 2022.07.12
5일 차(2022/07/08)  (0) 2022.07.08
4일 차(2022/07/07)  (0) 2022.07.07
2일차(2022/07/05)  (0) 2022.07.05
1일차(2022/07/04)  (0) 2022.07.05