LoginSignup
22
21

More than 5 years have passed since last update.

pandasで外部ファイルを読み込むときのdtype=strに気を付けろ

Last updated at Posted at 2019-01-25

2019/04/05更新
現在のバージョン(0.24.1)ではxlsxの挙動がcsvと同じになっていました。
JSONは相変わらずです。
また気づき次第更新します。

to 昨日の私

何かしらのデータをDataFrameに変換する際、"001"の頭の00が取れるなど意図しない挙動を避けるためにいったん全部文字列型で受け取ろうという設定がdtype=strです。
これに於けるnullの扱いがcsv、xlsx、jsonでそれぞれ違ったのでメモ。

用意したデータ

test.csv
name,code
すし,001
ピザ,002
カレー,
test.json
[
    {"name":"すし", "code":"001"},
    {"name":"ピザ", "code":"002"},
    {"name":"カレー", "code":null}
]

xlsxはcsvと同じなので省略

読み込み

import pandas
import pathlib
import IPython.display

csv_path = pathlib.Path('./test.csv')
csv = pandas.read_csv(csv_path, dtype=str, encoding='utf8')
display(csv)
name code
0 すし 001
1 ピザ 002
2 カレー NaN
xlsx_path = pathlib.Path('./test.xlsx')
xlsx = pandas.read_excel(xlsx_path, dtype=str, encoding='utf8')
display(xlsx)
name code
0 すし 001
1 ピザ 002
2 カレー nan
json_path = pathlib.Path('./test.json')
json = pandas.read_json(json_path, dtype=str, encoding='utf8')
display(json)
code name
0 001 すし
1 002 ピザ
2 None カレー

見事にバラけました。

fillna()

それぞれのDataFrameにnullを一括置換するfillna()をあててみます。

csv.fillna("000", inplace=True)
display(csv)
name code
0 すし 001
1 ピザ 002
2 カレー 000

csvはうまくいきましたが…

xlsx.fillna("000", inplace=True)
display(xlsx)
name code
0 すし 001
1 ピザ 002
2 カレー nan
json.fillna("000", inplace=True)
display(json)
code name
0 001 すし
1 002 ピザ
2 None カレー

xlsxとjsonでは失敗します。

原因

"nan"、"None"という文字列に変換されるためです。
replace()しましょう。

22
21
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
21