티스토리 뷰

반응형

파이썬의 딕셔너리를 CSV 파일로 만드는 방법을 배워보자. 과정은 파이썬의 딕셔너리를 판다스의 데이터프레임으로 바꾼다. 그리고 데이터프레임을 to_csv() 메소드를 활용하여 저장한다. 

 

예제를 보면 간단하다. 그러나 저장되는 형식에 대해서도 직관적으로 설명해 보겠다. CSV파일 여는 방법은 아래의 링크를 참고하자.

 

2021/01/09 - [인공지능(Artificial Intelligence)/python] - [pandas] 시리즈(Series) 기초정리

2021/01/10 - [인공지능(Artificial Intelligence)/python] - [pandas] 판다스 기초 한번에 정리

2021/01/11 - [인공지능(Artificial Intelligence)/python] - [pandas] csv 파일 열기

2021/01/12 - [인공지능(Artificial Intelligence)/python] - [pandas] Excel 파일 열기

2021/01/13 - [인공지능(Artificial Intelligence)/python] - [pandas] JSON 파일 열기

2021/01/14 - [인공지능(Artificial Intelligence)/python] - [pandas] HTML(웹) 불러오기

 

 

첫번째

우선 딕셔너리를 데이터 프레임으로 만들자.

 

import pandas as pd

data = {'name' : [ 'Jerry', 'Riah', 'Paul'],
        'algol' : [ "A", "A+", "B"],
        'basic' : [ "C", "B", "B+"],
        'c++' : [ "B+", "C", "C+"],
        }

df = pd.DataFrame(data)
df2 = pd.DataFrame(data)
df2.set_index('name', inplace=True)   #name 열을 인덱스로 지정
print(df)

'''
# output
    name algol basic c++
0  Jerry     A     C  B+
1   Riah    A+     B   C
2   Paul     B    B+  C+
'''

print(df2)

'''
# output
      algol basic c++
name                 
Jerry     A     C  B+
Riah     A+     B   C
Paul      B    B+  C+
'''

 

두번째

df는 name값을 index의 이름값을 지정하지 않고 딕셔너리로 바꾼 후에 모습이고, df2는 set_index()를 활용하여 좀 더 꾸민 코드이다. 이제 to_csv() 매서드를 활용해서 CSV 파일로 바꿔보자.

 

df.to_csv("./df_sample.csv")
'''
# 결과값
,name,algol,basic,c++
0,Jerry,A,C,B+
1,Riah,A+,B,C
2,Paul,B,B+,C+

'''




df2.to_csv("./df_sample2.csv")
'''
# 결과값
name,algol,basic,c++
Jerry,A,C,B+
Riah,A+,B,C
Paul,B,B+,C+

'''

 

세번째

사실 CSV 파일은 저장이 완료됐다. 그러나 나는 좀 더 확인해 보고 싶어서 아래 처럼 저장한 csv파일을 다시 출력해 보았다. 그 결과 첫 줄의 결과 값이 다르게 저장되는 것을 알 수 있다.

위의 저장된 CSV 파일을 다시 불러와서 확인해 보자.

 

result1 = pd.read_csv('./df_sample.csv')
print(result1)

'''
   Unnamed: 0   name algol basic c++
0           0  Jerry     A     C  B+
1           1   Riah    A+     B   C
2           2   Paul     B    B+  C+
'''


result2 = pd.read_csv('./df_sample2.csv')
print(result2)

'''
    name algol basic c++
0  Jerry     A     C  B+
1   Riah    A+     B   C
2   Paul     B    B+  C+
'''

 

result1을 보면 unnamed값이 포함되어 있는 것을 확인 할 수 있다. 따라서 재활용성을 생각해서 필요에 맞게 CSV 파일을 만들어 놓는 것이 중요하다고 할 수 있다.

 

 

 

 

네번째

그렇다면 인덱스를 지정하지 않을 때 바로 사용할 수 있는 해결법은, index=False를 사용해 주는 것이다. 아래의 예를 보자.

 

import pandas as pd

data = {'name' : [ 'Jerry', 'Riah', 'Paul'],
        'algol' : [ "A", "A+", "B"],
        'basic' : [ "C", "B", "B+"],
        'c++' : [ "B+", "C", "C+"],
        }

df = pd.DataFrame(data)
df2 = pd.DataFrame(data)
df2.set_index('name', inplace=True)   #name 열을 인덱스로 지정
print(df)


df.to_csv("./df_sample.csv")
df.to_csv("./df_sample2.csv", index=False)

'''df_sample.csv
,name,algol,basic,c++
0,Jerry,A,C,B+
1,Riah,A+,B,C
2,Paul,B,B+,C+
'''

'''df_sample2.csv
name,algol,basic,c++
Jerry,A,C,B+
Riah,A+,B,C
Paul,B,B+,C+
'''

 

위와 같이 index=False를 추가하면 인덱스를 무시되어 정확하게 잘 표시 되는 것을 알 수 있다.

 

 

 

 

응용적용

CSV 파일을 읽고 쓰는 과정을 파이썬으로 우선 구현을 해보고, 그리고 판다스로 구현을 해보면서 서로 비교를 해보겠다.

 

# 파이썬으로 구현하기

input_file = './numpy/datasets/csv_exam.csv'
output_file = './csv_exam_output.csv'

with open(input_file, 'r', newline='') as reader:
    with open(output_file, 'w', newline='') as writer:
        #print(reader)
        header = reader.readline()
        header = header.strip()
        header_list = header.split(',')
        writer.write(','.join(map(str, header_list))+'\n')
        for row in reader:
            row=row.strip()
            row_list=row.split(',')
            writer.write(','.join(map(str, row_list))+'\n')

 

파이썬으로 구현하려면 python 내장함수인 open을 사용한다. 그리고 strip으로 좌우 빈칸을 제거하고, split으로 리스트로 바꿔준다. 그 후에 리스트를 join과 map으로 정리해서 저장하는 것을 알 수 있다. 그렇다면 판다스를 이용한 같은 코드는 아래와 같다.

 

input_file = './numpy/datasets/csv_exam.csv'
output_file = './csv_exam_output.csv'

import pandas as pd
data_frame = pd.read_csv(input_file)
data_frame.to_csv(output_file, index=False)

 

python으로 구현한 코드보다 훨씬 깔끔한 것을 알 수 있다. 아래는 파이썬에 내장된 CSV 모듈을 사용하여 데이터 로딩이 가능하다.

 

# 3
import csv
input_file = './numpy/datasets/csv_exam.csv'
output_file = './csv_exam_output.csv'

with open(input_file, 'r', newline='') as csv_in_file:
    with open(output_file, 'w', newline='') as csv_out_file:
        filereader = csv.reader(csv_in_file, delimiter=',')
        filewriter = csv.writer(csv_out_file, delimiter=',')
        for row_list in filereader:
            print(row_list)
            filewriter.writerow(row_list)

 

기본적으로 csv에서는 reader와 writer를 제공해 준다. 그리고 필드 구분자를 delimiter를 활용하여 쉼표로 구분한 것을 알 수 있다. 마지막부분은 한줄씩 적는 것을 알 수 있다.

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함