LoginSignup
4
5

More than 5 years have passed since last update.

True/Falseを含むデータフレームをcsv形式でPythonからRへと引き渡す (pd.DataFrame -> tbl_df)

Last updated at Posted at 2017-04-23

大したことではないですが,pandas.DataFrameをcsvで保存してRのreadr::tbl_dfで読もうとしたらハマったので回避策をメモ.

小中規模のデータフレームを扱う場合,Pythonではpandas,Rではdata.frame系を使うことが一般的だと思います.

また,Python <=> R間でのデータフレームの受け渡しは,SQLを仲介する場合もあるでしょうが,楽にやるならcsvがベターだと思います.

csvによる受け渡しの問題点

ところがboolを含むpandas.DataFrameをそのままcsvに吐くとread_csvでlogicalとして読めないっぽいです.こんな感じ↓

from datetime import datetime
import pandas as pd

df = pd.DataFrame({
    'A': ('a1', 'a2', 'a3'),
    'B': (True, False, True),
    'C': (0, 1, 2),
    'D': [datetime.now()] * 3
})

df.to_csv('sample.csv', index=False, encoding='utf-8')
library(readr)

read_csv('sample.csv', col_types = 'cliT', locale = locale(encoding = 'UTF-8'))

スクリーンショット 2017-04-23 11.39.05.png

エラーを見ると,T・FやTRUE・FALSE,0・1しかlogicalとして受け付けてくれないっぽいです.

回避策

# df.to_csv('sample.csv', index=False, encoding='utf-8')
(df * 1).to_csv('sample.csv', index=False, encoding='utf-8')

とすれば良いです.True/Falseを1/0にしてくれます.
文字列に対する*は,「"hoge" * 2」を「"hogehoge"」とするような処理ですから,今回のように「* 1」しても何も変わりません.

スクリーンショット 2017-04-23 11.44.25.png

01であれば,read_csvで読み込めます.

スクリーンショット 2017-04-23 11.53.09.png

失敗例

ちなみに以下のような方法は失敗します.

df.astype(int)  # str等がある場合失敗する
df.replace({True: 1, False: 0})  # 何も起こらない
df.replace({True: "TRUE", False: "FALSE"})  # 1/0が全部文字列に (下図)

スクリーンショット 2017-04-23 11.50.58.png

(他に良い方法があれば教えてください)

4
5
0

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
4
5