[Python pandas] text, csv 파일 불러오기 : pd.read_csv()
Python 분석과 프로그래밍/Python 데이터 전처리 2016. 11. 22. 23:54Python 을 가지고 분석에 활용한다고 했을 때 데이터 전처리에 NumPy와 pandas library를 많이 사용합니다. 특히, 행과 열로 구성이 되어있는 DataFrame type 데이터를 입력, 처리, 조작할 때 pandas 가 매우 강력하고 편리합니다.
Python의 pandas library의 read_csv() 함수를 사용해서 외부 text 파일, csv 파일을 불러와서 DataFrame으로 저장하는 방법에 대해서 소개하겠습니다.
1. csv 파일 불러오기 : read_csv() |
아래와 같이 ID, LAST_NAME, AGE 3개의 열(column)을 가지고 있고, 5개의 행(row) 가지고 있는, 콤마로 구분된 CSV 파일(comma sepeated file)을 예제로 사용하겠습니다.
[예제 CSV 파일 : test_csv_file.csv => test_csv_file.csv ]
ID |
LAST_NAME |
AGE |
1 |
KIM |
30 |
2 |
CHOI |
25 |
3 |
LEE |
41 |
4 |
PARK |
19 |
5 |
LIM |
36 |
import 로 pandas library를 호출한 다음에 read_csv() 함수에 파일 경로와 파일 이름을 적어주면 됩니다. csv 파일은 구분자(separator, delimiter)를 명시적으로 ',' (comma)라고 지정해주지 않아도 알아서 잘 불러옵니다.
>>> import pandas as pd
|
DataFrame.shape 을 사용해서 행(row)과 열(column)의 개수를 확인해보고, 행과 열이 몇 개 안되므로 indexing 없이 전체를 호출해보겠습니다.
>>> csv_test.shape # number of rows, columns
|
Spyder (Python 3.5) 의 'Variable explorer' 창에 보면 csv 라는 이름의 DataFrame 이 신규로 생성되었으며, Size 란에 보면 (5, 3) 으로서 5개 행(rows), 3개 열(columns)으로 구성되어 있음을 알 수 있습니다.
csv DataFrame 이름을 클릭하면 아래 그림처럼 행과 열로 구성된 2차원이 DataFrame을 열어서 볼 수 있습니다.
2. 구분자 '|' 인 text 파일 불러오기 : sep='|' |
이번에는 구분자가 콤마(,)가 아닌 다른 기호, 가령, 수직 막대기 '|' 인 경우의 text 파일을 불러와보도록 하겠습니다.
[ 예제 test_text_file.txt => test_text_file.txt ]
ID|A|B|C|D
C1|1|2|3|4
C2|5|6|7|8
C3|1|3|5|7
read_csv() 함수는 동일하며, 파일 경로와 text 파일 이름을 써주고, 구분자(separator, delimiter)에 sep='|' 를 추가해줍니다.
>>> text_test = pd.read_csv('C:/Users/Administrator/Documents/Python/test_text_file.txt', sep='|')
|
만약 구분자가 탭(tab) 이라면 sep = '\t' 을 입력해줍니다.
3. 파일 불러올 때 index 지정해주기 : index_col |
만약에 위의 예에서 첫번째 열인 'ID'라는 이름의 변수를 Index 로 지정해주고 싶으면 index_col=0 (위치)이나 index_col='ID' 처럼 직접 변수 이름을 지정해주면 됩니다.
>>> # pass the column number you wish to use as the index:
|
>>> # pass the column name you wish to use as the index:
|
4. 변수 이름(column name, header) 이 없는 파일 불러올 때 이름 부여하기 : names=['X1', 'X2', ... ], header=None |
[ 예제 : 변수 이름이 없는 text 파일(no header) => text_without_column_name.txt ]
C1|1|2|3|4
C2|5|6|7|8
C3|1|3|5|7
names=['ID', 'A', 'B', 'C', 'D'] 와 같이 칼럼 이름을 부여해줍니다. header=None 은 칼럼 이름이 없다는 뜻이며, 만약 1번째 행이 칼럼 이름이라면 header=0 으로 지정해주면 됩니다.
>>> # naming columns :
|
5. 유니코드 디코드 에러, UnicodeDecodeError: 'utf-8' codec can't decode byte |
불러오려는 text, csv 파일의 encoding 설정과 Python encoding 설정이 서로 맞지 않으면 UnicodeDecodeError 가 발생합니다. 한글은 보통 'utf-8' 을 많이 사용하는데요, 만약 아래처럼 'utf-8' 코덱을 decode 할 수 없다고 에러 메시지가 나오는 경우가 있습니다.
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc1 in position 26: invalid start byte
이럴 경우에는 Windows에서 많이 사용하는 'CP949'로 아래처럼 encoding을 설정해서 text, csv 파일 불러오기를 해보시기 바랍니다.
f = pd.read_csv('directory/file', sep='|'', encoding='CP949')
|
f = pd.read_csv('directory/file', sep='|'', encoding='latin')
|
6. 특정 줄은 제외하고 불러오기: skiprows = [x, x] |
skip rows 옵션을 사용하여 첫번째와 두번째 줄은 제외하고 csv 파일을 DataFrame으로 불러와보겠습니다.
# skip 1st and 2nd rows (do not read 1, 2 rows) csv_2 = pd.read_csv("C:/Users/admin/Documents/data/test_csv_file.csv", skiprows = [1, 2]) |
7. n 개의 행만 불러오기: nrows = n |
csv 파일의 위에서 부터 3개의 행(rows) 만 DataFrame으로 불어와보겠습니다.
# read top 3 rows only csv_3 = pd.read_csv("C:/Users/admin/Documents/data/test_csv_file.csv", nrows = 3) |
8. 사용자 정의 결측값 기호 (custom missing value symbols) |
불러오려는 데이터셋 파일에 다양한 모양, 기호의 결측값이 들어있을 수 있습니다. 이때 사용자 정의 결측값 기호를 표기해줌으로써 이들 특정 기호를 pandas가 결측값으로 인식할 수 있도록 해줍니다. 가령 어떤 문서에 숫자형 변수에 결측값이 '??'라는 표시로 입력이 되어있다고 한다면, 이를 pandas DataFrame으로 불러읽어들였을 경우 float나 int로 인식되어 불러오는 것이 아니라 string으로 인식해서 '??'를 결측값이 아니라 문자형으로 불러오게 됩니다. 이럴 경우 '??'를 결측값이라고 인식하라고 알려주는 역할이 na_values = ['??'] 옵션입니다.
df = pd.read_csv('C:/Users/Administrator/Documents/Python/test_text_file.txt', na_values = ['?', '??', 'N/A', 'NA', 'nan', 'NaN', '-nan', '-NaN', 'null')
|
물론 데이터를 읽어들인 후에 후행적으로 결측값으로 인식되어야 할 것들(예: '?', 'N/A' 등)이 문자열로 잘못 인식되어 잘못 불어와졌을 경우 pandas의 데이터변환 함수를 사용해서 전처리할 수도 있습니다만, 자칫 결측값이 있는 줄도 모르고 결측값 처리를 안하고 다음번 분석으로 넘어갈 실수를 할 수도 있으므로 가급적 데이터를 불러오는 단계에서 결측값 기호를 사전에 파악하시고 '사용자 정의 결측값 기호 na_values = [] 옵션'을 사용해서 결측값으로 인식해서 불러오는 것이 가장 좋은 방법이라고 생각합니다.
9. 데이터 유형 설정 (Setting the data type per each column) |
df = pd.read_csv('C:/Users/Administrator/Documents/Python/test_text_file.txt', dtype = {"ID": int, "LAST_NAME": str, "AGE": float} )
|
날짜/시간 형태(date/time format)의 데이터의 경우 infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates 등의 시계열 데이터 형태에 특화된 옵션들이 있습니다. 자세한 내용은 아래의 pandas 매뉴얼을 참고하시기 바랍니다. 언제 시간이 되면 시계열데이터 전처리 및 분석은 별도의 세션으로 여러차례 연재를 해보겠습니다.
Python pandas 라이브러리의 read_csv() 함수를 이용한 text, csv 파일 불러오기 소개를 마치겠습니다.
많은 도움 되었기를 바랍니다.
- 파일의 날짜/시간(Date/Time) 데이터를 파싱해서 불러오기 => https://rfriend.tistory.com/536
- Python string methods 로 텍스트 데이터를 파싱해서 다차원배열 만드는 사용자 정의 함수 => https://rfriend.tistory.com/443
- For R Users : R로 text 파일, csv 파일 불러오기 => http://rfriend.tistory.com/16
- Python으로 엑셀 데이터 불러와서 DataFrame으로 만들기 => https://rfriend.tistory.com/464
- Python의 DataFrame 자료를 엑셀로 내보내기 => https://rfriend.tistory.com/466
- Python 으로 JSON 포맷 자료 읽기, 쓰기 => https://rfriend.tistory.com/474
- 웹(API)에서 JSON 포맷 자료 읽어와서 pandas DataFrame으로 만들기 => https://rfriend.tistory.com/475
'Python 분석과 프로그래밍 > Python 데이터 전처리' 카테고리의 다른 글
[Python pandas] DataFrame의 index 재설정(reindex) 와 결측값 채우기(fill in missing values) (4) | 2016.11.27 |
---|---|
[Python pandas] DataFrame의 행 또는 열 데이터 선택해서 가져오기 (DataFrame objects indexing and selection) (2) | 2016.11.27 |
[Python pandas] pd.DataFrame 만들고 Attributes 조회하기 (0) | 2016.11.26 |
[Python pandas] DataFrame을 csv 파일로 내보내기 : df.to_csv() (11) | 2016.11.26 |
[Python pandas] DB에 접속해서 데이터 불러오기 (DB connection and SQL query) (0) | 2016.11.25 |
[Python pandas] text, csv 파일 불러오기 : pd.read_csv() (16) | 2016.11.22 |
댓글을 달아 주세요
좋은 글 잘 봤습니다!!
도움에 되었가니 기쁘네요. 댓글 감사합니다. ^^
좋은글 감사합니다!!
댓글 감사합니다. :-)
안녕하세요 ^^ 글 잘 보고있습니다 ㅠㅠ 혹시 실행중에
FileNotFoundError Traceback (most recent call last)
<ipython-input-1-7cb84f4e32cf> in <module>
1 import pandas as pd
----> 2 csv_test = pd.read_csv('C:/Users/Administrator/Documents/Python/test_csv_file.csv')
~\anaconda3\lib\site-packages\pandas\io\parsers.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, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)
684 )
685
--> 686 return _read(filepath_or_buffer, kwds)
687
688
~\anaconda3\lib\site-packages\pandas\io\parsers.py in _read(filepath_or_buffer, kwds)
450
451 # Create the parser.
--> 452 parser = TextFileReader(fp_or_buf, **kwds)
453
454 if chunksize or iterator:
~\anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, f, engine, **kwds)
944 self.options["has_index_names"] = kwds["has_index_names"]
945
--> 946 self._make_engine(self.engine)
947
948 def close(self):
~\anaconda3\lib\site-packages\pandas\io\parsers.py in _make_engine(self, engine)
1176 def _make_engine(self, engine="c"):
1177 if engine == "c":
-> 1178 self._engine = CParserWrapper(self.f, **self.options)
1179 else:
1180 if engine == "python":
~\anaconda3\lib\site-packages\pandas\io\parsers.py in __init__(self, src, **kwds)
2006 kwds["usecols"] = self.usecols
2007
-> 2008 self._reader = parsers.TextReader(src, **kwds)
2009 self.unnamed_cols = self._reader.unnamed_cols
2010
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader.__cinit__()
pandas\_libs\parsers.pyx in pandas._libs.parsers.TextReader._setup_parser_source()
FileNotFoundError: [Errno 2] No such file or directory: 'C:/Users/Administrator/Documents/Python/test_csv_file.csv'
이건 무슨뜻인지 알수있을까요...
정말 초짜여서요 ㅜㅜ
안녕하세요.
해당 경로에 해당 이름의 파일이 없다는 에러 메시지네요.
경로와 파일 이름을 다시 한반 확인해 보시기 바랍니다.
다시한번 해보겠습니다 감사합니다 :)
csv 파일에 첫행은 변수명이고, 둘째 행 부터 데이터인데, 데이터가 너무 많아서 예를 들어 10줄에 한줄씩만 읽어 들여서 작업을 하고 싶은데 어떻게 하는 지 한 수 부탁드립니다.
(방법 1)
readline() 메소드를 사용해서 한 줄씩 읽어들이고(read line by line), 매 10번째 줄마다 쓰기( write)를 하면서 새로 파일을 하나 만든 후에, pandas의 pd.read_csv() 로 매 10번째 줄의 데이터로만 만들어진 데이터셋을 읽어들이면 되겠네요.
[readline() 메소드 참고]
https://rfriend.tistory.com/524
[한줄식 읽어들이면서, 매 10번째 행을 파일에 쓰기 (댓글에는 들여쓰기가 안되어서 '--'로 들여쓰기 표기했습니다)]
with open(in_name, 'r') as in_file:
----with open(out_name, 'w') as out_file:
--------count = 0
--------for line in in_file:
------------if count % 10 == 0:
----------------out_file.write(line)
------------count += 1
(방법 2)
만약 전체 행의 개수를 미리 알고 있다면 pd.read_csv() 의 skiprows 매개변수를 사용할 수도 있습니다. skiprows_list = [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, .... ] 이런식으로 매 10번째 숫자는 뺀 리스트를 만들어서 pd.read_csv(, .., skiprows = skiprows_list, ...) 이렇게 설정하는 것도 방법이예요.
죄송하지만 txt 파일을 불러오는데 자꾸 이런 메시지가 떠요.
File "<ipython-input-15-c5e7495f45e5>", line 1
with open(path. encoding='cp949') as ff:
^
SyntaxError: keyword can't be an expression
혹시 해결 방법을 알 수 있을까요?
그리고 옆에 있는 파일 중 txt 파일을 클릭하면 한글이 깨져서 뜨네요.
안녕하세요.
with open(path) as ff:
처럼 해보실래요?
코드를 보니 path 다음에 '콤마(,)'를 써야 하는데 '마침표(.)'를 썼기 때문에 SyntaxError 가 났네요.
그리고 혹시 Windows10을 쓰고 계시다면 default Encoding 이 'cp949' 이기 때문에 별도로 명기하지 않아도 될거예요.
https://rfriend.tistory.com/523
혹시 Encoding 문제라면, 'utf-8' 또는 'latin' 도 시도해보시기 바랍니다.
글쓴이같은 분이 더 많아져야 한다고 생각합니다. 기초 정보 뿐만 아니라 꿀팁까지 가득이네요...
따뜻한 댓글 감사합니다.
블로그 쓰는 보람을 느끼네요.
감사합니다. :-)
비밀댓글입니다
비밀댓글입니다
안녕하세요. 데이터분석 공부하신다니 응원합니다. 화이팅하시구요! :-)