NumPyのndarray その9 色々な型のデータが混在しているCSVファイルでもndarrayに読み込む方法
昨日はndarrayに色々な型のデータが混在したCSVファイルを読みこめなかった!というのをまとめました。
なんとかして読み込めないの!?
無理だったと言われても。
なんとかならないもの?ということで調べてみました。
- 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 投稿