らふのプログラミングメモ

プログラミングメモです。

NumPyのndarray その9 色々な型のデータが混在しているCSVファイルでもndarrayに読み込む方法

昨日はndarrayに色々な型のデータが混在したCSVファイルを読みこめなかった!というのをまとめました。

rafu.hatenablog.jp

なんとかして読み込めないの!?

無理だったと言われても。
なんとかならないもの?ということで調べてみました。

  • loadtxt()の引数で文字列として無理矢理読み込む方法。
  • genfromtxt()を使って、CSVファイルのデータのままの型で読み込む。

この2種類があるみたいです。

というわけで、前回と同じテストデータを使ってやってみましょう。

test.csv(文字コード:Shift-JIS)の中身 (1行目にはインデックスを入れてあります。)


名前,日付,テスト
Ito,2021/08/10,85
Suzuki,2021/08/10,80
Tanaka,2021/08/10,75


loadtxt()で文字列として強制的に読み込む。

まずはloadtxt()を使ってやってみましょう。
文字列として読み込みたいのでunicode_を指定してみました。
(ちなみに全て数値に指定してみたところ、文字列のところで昨日と全く同じエラーが出ました。)

import numpy as np

n_a = np.loadtxt("test.csv",delimiter = ",",encoding = "shift-JIS",dtype = "unicode_",skiprows = 1)

print(n_a)

print(n_a.dtype)

n_aの結果:
[ ["Ito" "2021/08/10" "85"]
["Suzuki" "2021/08/10" "80"]
["tanaka" "2021/08/10" "75"] ]

n_a.dtypeの結果:<U10

このようにdtypeにunicode_を設定することで、
数値も文字列(unicode文字列)としてndarrayに入れることができました。

genfromtxt()を使って、CSVファイルのデータのままの型で読み込む。

今度はgetfromtxt()を使ってみましょう。

import numpy as py

n_b = np.genfromtxt("test.csv",delimiter = ",", dtype = None, encoding = "shift-JIS",names = True)

print(n_b)

print(n_b.dtype)

n_bの結果:
[("Ito","2021/08/10",85) ("suzuki","2021/08/10",80) ("tanaka","2021/08/10",75)]
n_b.dtypeの結果:
[("名前”,"<U6"),("日付","<U10"),("テスト","<i4")]

これより、名前と日付は文字列(unicode文字列)で、
テストの値にはuint32の符号なし32ビット整数で入力をすることができました。

~ 注意点 ~
今回のように型が違ったものを読み込みたい場合、
genfromtxt()の引数で必ず以下のところは指定してください。

  • dtype = None
    Noneにすることでファイルの型をそのまま自動で割り振ってくれる。

  • names = True
    Trueで最初の1行目がフィールドの名前ということで除外して読み込む。

  • encoding = "shift-JIS"
    これは読み込みたいファイルのエンコードを設定してください。

<最終更新日:2021/09/16>
2021/09/16 投稿