■ はじめに
https://dk521123.hatenablog.com/entry/2019/10/22/014957
https://dk521123.hatenablog.com/entry/2020/04/06/235555
https://dk521123.hatenablog.com/entry/2020/10/14/000000
の続き。 今回は、Pandas を使ったCSVの扱いについて取り上げる。
目次
【1】CSV を読み込む 0)サンプル 1)ヘッダなしCSV を読み込むには 【2】CSV に書き込む 0)サンプル 1)ヘッダー、インデックスを除外するには 2)区切り文字、囲み文字の指定を行うには 【3】文字列(CSV形式)をデータフレーム化 0)サンプル 【Z】使用上の注意 1)セパレータ sep は、一文字を指定(複数文字不可)
【1】CSV を読み込む
* pandas.read_csv を使えばいい
https://pandas.pydata.org/docs/reference/api/pandas.read_csv.html
0)サンプル
import pandas as pd # read_csv() でCSVファイルを読み込む df = pd.read_csv('hello.csv', encoding='UTF-8') # 以下でもOK # df = pd.read_csv('hello.csv', encoding='UTF-8', header=0) print(df) print('*****************') print(df['item3'][0]) # Mike print(df['item3']) print('*****************') print(df[0:2]) print('*****************') for value in df['item2']: print(value) # world1 ... print('*****************') print('** for header ***************') header_list = df.columns print(header_list) for item in header_list: print(item)
hello.csv
item1,item2,item3 hello1,world1,Mike hello2,world2,Tom hello3,world3,Smith hello4,world4,Kevin
出力結果
item1 item2 item3 0 hello1 world1 Mike 1 hello2 world2 Tom 2 hello3 world3 Smith 3 hello4 world4 Kevin ***************** 0 Mike 1 Tom 2 Smith 3 Kevin Name: item3, dtype: object ***************** item1 item2 item3 0 hello1 world1 Mike 1 hello2 world2 Tom ** for header *************** Index(['item1', 'item2', 'item3'], dtype='object') item1 item2 item3
1)ヘッダなしCSV を読み込むには
import pandas as pd # 「header=None」「namesでヘッダ名」を指定する df = pd.read_csv( file_path, header=None, names=['id', 'name'] )
https://qiita.com/yuba/items/d09e387a1ec191eb2738
【2】CSV に書き込む
* pandas.DataFrame.to_csv を使えばいい。
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.to_csv.html
0)サンプル
import pandas as pd df = pd.DataFrame( { 'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9] }) # to_csv() で書き込む df.to_csv('output.csv', encoding='utf-8')
出力結果:output.csv
,A,B,C 0,1,4,7 1,2,5,8 2,3,6,9
1)ヘッダー、インデックスを除外するには
import pandas as pd list = [ {'item1': 1, 'item2': 2, 'item3': 3}, {'item1': 4, 'item2': 5, 'item3': 6}, {'item1': 7, 'item2': 8, 'item3': 9} ] df = pd.DataFrame(list) df.to_csv( 'output.csv', header=False, index=False )
出力結果:output.csv
1,2,3 4,5,6 7,8,9
2)区切り文字、囲み文字の指定を行うには
import pandas as pd import datetime as datetime def generate_csv(csv_file_path, csv_data, csv_columns): df = pd.DataFrame(csv_data) df.columns = csv_columns df.to_csv( csv_file_path, sep='|', index=False, quotechar='"', escapechar="/", encoding='utf-8') # Data csv_data = [ [1, "Mike", 29, datetime.datetime.now(), "Hello\nWorld"], [2, "Tom", 31, datetime.datetime.now(), "Hello\nWorld"], [3, "Kevin", 44, datetime.datetime.now(), "Hello\nWorld"], [4, "Sam", 26, datetime.datetime.now(), "Hello\nWorld"], [5, "Smith", 19, datetime.datetime.now(), "Hello\nWorld"], ] csv_columns = ["id", "name", "age", "created_at", "comment"] generate_csv("output.csv", csv_data, csv_columns) print("Done")
出力結果「output.csv」
id|name|age|created_at|comment 1|Mike|29|2021-11-26 10:52:13.228098|"Hello World" 2|Tom|31|2021-11-26 10:52:13.228098|"Hello World" 3|Kevin|44|2021-11-26 10:52:13.228098|"Hello World" 4|Sam|26|2021-11-26 10:52:13.228098|"Hello World" 5|Smith|19|2021-11-26 10:52:13.228098|"Hello World"
【3】文字列(CSV形式)をデータフレーム化
0)サンプル
import pandas as pd import io csv_data = """ 1,Mike,hello 2,Smith,World 3,Tom,!!! """ csv_header = ["no", "name", "remarks"] data_frame = pd.read_csv( io.StringIO(csv_data), sep=',', header=None, names=csv_header) for index, row in data_frame.iterrows(): print('*[{}]****'.format(index)) for item in csv_header: print("{} - {}".format(item, row[item])) print('*****')
出力結果
*[0]**** no - 1 name - Mike remarks - hello ***** *[1]**** no - 2 name - Smith remarks - World ***** *[2]**** no - 3 name - Tom remarks - !!! *****
【Z】使用上の注意
1)セパレータ sep は、一文字を指定(複数文字不可)
df.to_csv(buffer, header=True, index=True, sep="==") とした場合、 例外「TypeError: "delimiter" must be a 1-character string」が 発生する => 複数文字は指定できない
関連記事
Pandas ~入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/22/014957
Pandas ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2020/10/14/000000
Pandas ~ 基本編 / データのクレンジング ~
https://dk521123.hatenablog.com/entry/2020/04/06/235555
Pandas ~ 基本編 / JSON編 ~
https://dk521123.hatenablog.com/entry/2022/02/16/000000
Pandas ~ 基本編 / Excel編 ~
https://dk521123.hatenablog.com/entry/2020/11/18/000000
Python ~ 基本編 / CSV ~
https://dk521123.hatenablog.com/entry/2019/11/07/214108
NumPy ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/03/28/224532