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 投稿
NumPyのndarray その8 型がいろいろ混ざっているCSVファイルをndarrayに読み込んでみよう
昨日はndarrayに整数のみのCSVファイルを読みこむというのをまとめました。
ここで1つ疑問が。
型を混ぜてndarrayに入力しようとした場合、どうなるんだろう?
なんでこのような疑問が出たの?
上の記事でやってみましたが、
型を混ぜてndarrayに入力しようとした場合、
自動で型変換されていました。
ということは、今回も型変換されてしまうのか? 試してみたいと思います。
まずは以前と同じテストファイルを使ってみよう
前回と同じファイル(test.csv)を使ってみたら
どのように読み込まれるかをやってみたいと思います。
このファイルは文字列・日付・数値(int)が入ったものです。
例:
今回もtest.csvというCSVファイルを読み込んでみます。
CSVファイルの配置場所は、Pythonの実行環境と同じ場所においてみます。
python/
├ NNN.py(今回実行するファイル)
├ test.csv(読み込みたいCSVファイル)
test.csv(文字コード:Shift-JIS)の中身 (1行目にはインデックスを入れてあります。)
名前,日付,テスト
Ito,2021/08/10,85
Suzuki,2021/08/10,80
Tanaka,2021/08/10,75
実際にデータを取り込んでみよう!
NNN.py
import numpy as np # loadtxtを使って区切り文字を使ったファイルの読み込みを行う。 # encoding:shift_JISのファイルなので指定します。 # delimiter:デフォルトは空白なので、カンマの指定をします。 # skiprows:1行目にインデックスがあるので、これを除外します。 n_array = np.loadtxt("test.csv", encoding = "shift_JIS" ,delimiter = "," , skiprows = 1 ) print(n_array)
結果:エラーが出ました。
内容:could not convert string to float: "Ito"
どうやら文字列が入っているものはダメなようです。
次に、名前を除外したCSVファイル(test3.csv)を作ってみます。
test3.csv
日付,テスト
2021/08/10,85
2021/08/10,80
2021/08/10,75
このtest3.csvを読み込むように変更して実行してみます。
n_array = np.loadtxt("test3.csv", encoding = "shift_JIS" ,delimiter = "," , skiprows = 1 )
すると、先ほどと同じようなエラーが出ました。
エラー内容:could not convert string to float: "2021/08/10"
これより、文字列はloadtxt()では読み込めないことがわかりました。
<最終更新日:2021/09/15>
2021/09/15 投稿