【Python】 Pandas ~ 基本編 / CSV編 ~

■ はじめに

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