■ はじめに
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)データ型を指定して読み込むには 【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)データ型を指定して読み込むには
import pandas as pd input_path = "inputs/input1.csv" # dtype で指定(数字以外は object なんであんま意味ないかも、、、) data_frame = pd.read_csv(input_path, encoding='UTF-8', dtype = { 'id':'int64', 'name':'object', 'registered_datetime':'object' } ) print("**************") print(data_frame) print("**************") print(data_frame.info())
inputs/input1.csv
id,name,registered_datetime 1,Mike,"2021-01-12 23:12:32" 2,Tom,"2022-02-12 23:12:32" 3,Smith,"2023-03-12 23:12:32" 4,Kevin,"2024-04-12 23:12:32"
出力結果
************** id name registered_datetime 0 1 Mike 2021-01-12 23:12:32 1 2 Tom 2022-02-12 23:12:32 2 3 Smith 2023-03-12 23:12:32 3 4 Kevin 2024-04-12 23:12:32 ************** <class 'pandas.core.frame.DataFrame'> RangeIndex: 4 entries, 0 to 3 Data columns (total 3 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 id 4 non-null int64 1 name 4 non-null object 2 registered_datetime 4 non-null object dtypes: int64(1), object(2) memory usage: 228.0+ bytes None
【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
Pandas ~ Parquet ~
https://dk521123.hatenablog.com/entry/2024/09/06/004125
Python ~ 基本編 / CSV ~
https://dk521123.hatenablog.com/entry/2019/11/07/214108
NumPy ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2018/03/28/224532