【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 を読み込む
 [補足] ヘッダなしCSV を読み込むには
【2】CSV に書き込む
 [補足] ヘッダー、インデックスを除外するには
【3】文字列(CSV形式)をデータフレーム化
【Z】使用上の注意
 1)セパレータ sep は、一文字を指定(複数文字不可)

【1】CSV を読み込む

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'])
print('*****************')
print(df[0:2])

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

[補足] ヘッダなし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 に書き込む

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

[補足] ヘッダー、インデックスを除外するには

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

【3】文字列(CSV形式)をデータフレーム化

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 ~ 基本編 / 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