JMP18 : python : la conversion de pandas en dataTable ignore les colonnes avec des valeurs manquantesimport jmp, numpy as np, pandas as pd
import jmputils
def p2j(df):
dt2 = jmp.DataTable('dt2', df.shape[0])
# get the column names from the data frame
names = list(df.columns)
# loop across the columns of the data frame
for j in range( df.shape[1]):
# check if the coulumn data type is string or numeric
if is_string_dtype(df[names[j] ]):
dt2.new_column(names[j], jmp.DataType.Character)
else:
dt2.new_column(names[j], jmp.DataType.Numeric)
# populate the JMP column with data
dt2[j] = list(df.iloc[:,j])
return(dt2)
fname = r"export.csv";
df = pd.read_csv(fname)
filt_csv = p2j(df);Utiliser le code ci-dessus pour lire un fichier csv. La fonction p2j ne semble pas importer correctement col3 car elle contient des valeurs manquantes

contenu du fichier csv
"col1", "col2", "col3"
"abc"
"un B",""
"a", "b", "e"
"un B",""
Automatisation et scriptsRe : JMP18 : python : la conversion de pandas en dataTable ignore les colonnes avec des valeurs manquantesEn utilisant le p2j( ) ci-dessus et un export.csv mis à jour avec une colonne de données numériques ayant une valeur manquante comme première valeur donne :

% de plus ~/Downloads/export.csv
"col1", "col2", "col3", "col4"
"abc",
"a", "b", "2,718
"a", "b", "e", 1,618
"a", "b", "3.14159
Re : JMP18 : python : la conversion de pandas en dataTable ignore les colonnes avec des valeurs manquantesCode mis à jour affiché ici, si le type de colonne n'est pas numérique ou chaîne, vérifiez jusqu'à ce que nous obtenions une valeur non manquante avant de déterminer le type de colonne comme caractère ou numérique.
import jmp
import numpy as np, pandas as pd
from pandas.api.types import is_string_dtype
from pandas.api.types import is_numeric_dtype
def p2j(df):
dt2 = jmp.DataTable('dt2', df.shape[0])
# get the column names from the data frame
names = list(df.columns)
# loop across the columns of the data frame
for j in range( df.shape[1]):
# check if the coulumn data type is string or numeric
if is_numeric_dtype( df[ names[j] ] ):
dt2.new_column(names[j], jmp.DataType.Numeric)
dt2[j] = list(df.iloc[:,j]) # populate the JMP column with data
elif is_string_dtype( df[ names[j]] ):
dt2.new_column(names[j], jmp.DataType.Character)
dt2[j] = list(df.iloc[:,j]) # populate the JMP column with data
else:
col = list()
dtype = None
for i in range(dt2.nrows):
cell_value = df.iloc[i,j]
# delay setting column type until we see first non-null value
if pd.isna( cell_value ):
col.append(None)
else:
if not dtype:
if is_numeric_dtype( cell_value ):
dtype = jmp.DataType.Numeric
else:
# assume it's character - could be datetime64,...
dtype = jmp.DataType.Character
col.append( cell_value )
print(col)
if dtype:
dt2.new_column(names[j], dtype)
dt2[j] = col # populate the JMP column with data
return(dt2)
fname = r"export.csv";
df = pd.read_csv(jmp.HOME + 'Downloads/' + fname)
print(df)
print(df.dtypes)
print( f'col1 is a string: {is_string_dtype(df[names[0]])}' )
print( f'col2 is a string: {is_string_dtype(df[names[1]])}' )
print( f'col3 is a string: {is_string_dtype(df[names[2]])}' )
filt_csv = p2j(df);
Cela donne les résultats :
/*:
col1 col2 col3
0 a b c
1 a b NaN
2 a b e
3 a b NaN
col1 object
col2 object
col3 object
dtype: object
col1 is a string: True
col2 is a string: True
col3 is a string: False
['c', None, 'e', None]
Remarquez que dans ma fonction, j'ai converti le NaN qui est numérique en Aucun. Le code JMP DataTable n'acceptera aucun dans les colonnes numériques ou les colonnes de caractères et fera ce qu'il faut. En mettant un NaN dans une colonne numérique et une chaîne vide "" dans une colonne Caractère.
Re : JMP18 : python : la conversion de pandas en dataTable ignore les colonnes avec des valeurs manquantesLa réponse courte est que is_string_dtype( col3 ) renvoie False. Ce n'est pas une colonne de chaînes, c'est une colonne d'objets, certaines sont des chaînes, d'autres sont NaN. Le code ci-dessus traite tout ce qui n'est pas une chaîne comme numérique. Les NaN sont correctement indiqués comme manquants, mais les valeurs de caractères « c » et « e » ne sont pas valides pour une colonne numérique et deviennent des valeurs manquantes. Je cherche une meilleure réponse sur la lecture de la colonne pandas en tant que caractère, sans tester chaque valeur.