본문 바로가기
프로그래밍/파이썬

판다스(Pandas)에서 CSV파일 읽기

by 깊은대학 2023. 5. 18.

CSV(comma-separated values) 파일은 데이터를 쉼표로 분리된 테이블로 저장한 텍스트 파일이다.

 

 

예를 들면 다음과 같은 것이다. 

 

이름,   회사,   직책, 생년월일 
대조영, 대우상사, 과장, 1990-02-01 
왕건, 미래바이오, 부장, 1981-09-17 
이성계, 오성텔레콤, 대리, 2000-05-15

 

판다스(Pandas) 라이브러리의 read_csv() 함수를 이용하면 CSV파일을 읽어서 판다스의 데이터 구조인 DataFrame 타입으로 저장할 수 있다. read_csv() 함수의 주요 인자는 다음과 같다.

 

import pandas as pd
data = pd.read_csv(file_path, thousands=’,’, header=None)

 

thousands는 천 단위로 쉼표로 끊어져 있는 숫자를 인식한다. 파일에 데이터만 있으면 header=None으로 설정하면 되며, 만약 데이터가 시작되기 전에 컬럼(column, 열) 이름이나 설명문이 들어가 있고 데이터는 두번째 줄부터 시작한다면 header=0으로 설정하면 된다. 다음과 같이 csv파일로 저장된 Nvidia 주가가 있을 때,

 

2023-01-03,148.509995,149.960007,140.960007,143.149994,143.125687,40127700
2023-01-04,145.669998,148.529999,142.410004,147.490005,147.464966,43132400
2023-01-05,144.910004,145.639999,141.479996,142.649994,142.625763,38916800
2023-01-06,144.740005,150.100006,140.339996,148.589996,148.564758,40504400
2023-01-09,152.839996,160.559998,151.410004,156.279999,156.253464,50423100
2023-01-10,155.070007,159.619995,154.720001,159.089996,159.062988,38410100

.....

2023-05-12,285.290009,287.799988,280.459991,283.399994,283.399994,27402700
2023-05-15,285.079987,289.690002,281.519989,289.529999,289.529999,29392600

 

이를 읽기 위해서는

 

data = pd.read_csv('NVDA.csv', header=None)

 

하면 된다. 데이터 상단에서 몇개(여기서는 5개)의 데이터만 프린트하고 싶다면 head 메소드를 사용한다. 하단부분만 프린트하고 싶다면 trail 메소드를 사용한다.

 

print(data.head(5))


        0           1           2      ...       4           5         6
0  2023-01-03  148.509995  149.960007  ...  143.149994  143.125687  40127700
1  2023-01-04  145.669998  148.529999  ...  147.490005  147.464966  43132400
2  2023-01-05  144.910004  145.639999  ...  142.649994  142.625763  38916800
3  2023-01-06  144.740005  150.100006  ...  148.589996  148.564758  40504400
4  2023-01-09  152.839996  160.559998  ...  156.279999  156.253464  50423100

 

컬럼(열)을 제거하려면 drop()함수를 사용한다. 5번 컬럼을 제거하려면 다음과 같이 한다.

 

data.drop([5], axis=1, inplace=True)


       0           1           2           3            4         6
0  2023-01-03  148.509995  149.960007  140.960007  143.149994  40127700
1  2023-01-04  145.669998  148.529999  142.410004  147.490005  43132400
2  2023-01-05  144.910004  145.639999  141.479996  142.649994  38916800
3  2023-01-06  144.740005  150.100006  140.339996  148.589996  40504400
4  2023-01-09  152.839996  160.559998  151.410004  156.279999  50423100

 

DataFrame의 컬럼 이름을 변경하기 위해서는 다음과 같이 한다.

 

data.columns = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume']


       Date        Open        High         Low       Close    Volume
0  2023-01-03  148.509995  149.960007  140.960007  143.149994  40127700
1  2023-01-04  145.669998  148.529999  142.410004  147.490005  43132400
2  2023-01-05  144.910004  145.639999  141.479996  142.649994  38916800
3  2023-01-06  144.740005  150.100006  140.339996  148.589996  40504400
4  2023-01-09  152.839996  160.559998  151.410004  156.279999  50423100

 

해당 기간 동안의 시가(Open)와 종가(Close)를 그려보려면 다음과 같이 한다.

 

from matplotlib import pyplot as plt
fig, ax = plt.subplots()
ax.plot(data['Date'], data['Open'], label='Open')
ax.plot(data['Date'], data['Close'], label='Close')
plt.title('NVDA data')
plt.xlabel('Date')
plt.ylabel('Price')
ax.legend()
plt.show()

 

날짜만 따로 저장하려면 다음과 같이 한다.

 

dates = pd.to_datetime(data['Date'])
print(dates.head(5))

0   2023-01-03
1   2023-01-04
2   2023-01-05
3   2023-01-06
4   2023-01-09

 

날짜를 제외한 나머지 컬럼 데이터를 따로 저장하려면 다음과 같이 한다.

 

cols = list(data)[1:6] # ['Open', 'High', 'Low', 'Close', 'Volume']
prices = data[cols]
print(prices.head(5))

     Open        High         Low       Close    Volume
0  148.509995  149.960007  140.960007  143.149994  40127700
1  145.669998  148.529999  142.410004  147.490005  43132400
2  144.910004  145.639999  141.479996  142.649994  38916800
3  144.740005  150.100006  140.339996  148.589996  40504400
4  152.839996  160.559998  151.410004  156.279999  50423100

 

Date를 기준으로 현재부터 과거 순으로 소팅하려면 sort_values() 함수를 사용한다.

 

data.sort_values(by=['Date'], axis=0, ascending=False, inplace=True)
data.reset_index(inplace=True)
print(data.head(5))

 

그러면,

 

     index   Date       Open        High        Low       Close      Volume
0     91  2023-05-15  285.079987  289.690002  281.519989  289.529999  29392600
1     90  2023-05-12  285.290009  287.799988  280.459991  283.399994  27402700
2     89  2023-05-11  288.959991  289.500000  282.459991  285.779999  32214900
3     88  2023-05-10  290.049988  291.130005  284.609985  288.850006  36935000
4     87  2023-05-09  288.989990  289.730011  284.500000  285.709991  31486900

 

이 되어서 자동으로 index 컬럼이 추가된다. 이것을 제거하려면 drop()함수를 사용한다.

 

data.drop(['index'], axis=1, inplace=True)

      Date        Open        High         Low       Close    Volume
0  2023-05-15  285.079987  289.690002  281.519989  289.529999  29392600
1  2023-05-12  285.290009  287.799988  280.459991  283.399994  27402700
2  2023-05-11  288.959991  289.500000  282.459991  285.779999  32214900
3  2023-05-10  290.049988  291.130005  284.609985  288.850006  36935000
4  2023-05-09  288.989990  289.730011  284.500000  285.709991  31486900

 

Date컬럼의 string에서 ‘-‘를 제거하려면 str.replace()함수를 사용한다.

 

data['Date'] = data['Date'].str.replace('-','')

      Date        Open        High         Low       Close    Volume
0  20230515  285.079987  289.690002  281.519989  289.529999  29392600
1  20230512  285.290009  287.799988  280.459991  283.399994  27402700
2  20230511  288.959991  289.500000  282.459991  285.779999  32214900
3  20230510  290.049988  291.130005  284.609985  288.850006  36935000
4  20230509  288.989990  289.730011  284.500000  285.709991  31486900

 

 

 

댓글