Ce n'est pas un gros problème, mais j'étais accro à la sauvegarde de pandas.DataFrame au format csv et à le lire avec le reader :: tbl_df de R, alors notez la solution de contournement.
Lorsqu'il s'agit de trames de données de petite et moyenne taille, je pense qu'il est courant d'utiliser des pandas pour Python et data.frame pour R.
De plus, le passage de trames de données entre Python <=> R peut servir de médiateur SQL, mais je pense que csv est meilleur si vous le faites facilement.
Cependant, si pandas.DataFrame avec booléen est envoyé en csv tel quel, il semble qu'il ne puisse pas être lu comme logique avec read \ _csv. Comme ça ↓
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'))
En regardant l'erreur, il semble que seuls T / F, TRUE / FALSE et 0/1 sont acceptés comme logiques.
# df.to_csv('sample.csv', index=False, encoding='utf-8')
(df * 1).to_csv('sample.csv', index=False, encoding='utf-8')
Tu peux le faire. Il définit True / False sur 1/0. \ * Pour une chaîne de caractères est un processus qui change "" hoge "\ * 2" en "" hogehoge "", donc même si vous "\ * 1" comme cette fois, rien ne changera.
S'il est 01, il peut être lu avec read \ _csv.
À propos, la méthode suivante échoue.
df.astype(int) #Échec s'il y a str etc.
df.replace({True: 1, False: 0}) #Il ne se passe rien
df.replace({True: "TRUE", False: "FALSE"}) # 1/0 est tout dans la chaîne de caractères(Figure ci-dessous)
(S'il vous plaît dites-moi s'il existe un autre bon moyen)
Recommended Posts