JMP18: python: la conversione da panda a dataTable salta le colonne con valori mancantiimport 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);Utilizzando il codice sopra per leggere un file CSV. La funzione p2j sembra non importare correttamente col3 poiché presenta valori mancanti

contenuto del file CSV
"col1","col2","col3"
"a","b","c"
"a","b",""
"a","b","e"
"a","b",""
Automazione e scriptingRi: JMP18: python: la conversione da panda a dataTable salta le colonne con valori mancantiUtilizzando p2j() sopra e un file export.csv aggiornato con una colonna di dati numerici aventi un valore mancante come primo valore si ottiene:

% in più ~/Downloads/export.csv
"col1","col2","col3","col4"
"a","b","c",
"a","b","",2.718
"a","b","e",1.618
"a","b","",3.14159
Ri: JMP18: python: la conversione da panda a dataTable salta le colonne con valori mancantiCodice aggiornato mostrato qui, se il tipo di colonna non è numerico o stringa, controlla finché non otteniamo un valore non mancante prima di determinare il tipo di colonna come carattere o numerico.
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);
Questo dà i risultati:
/*:
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]
Nota nella mia funzione ho convertito il NaN che è numerico in None. Il codice JMP DataTable accetterà None nelle colonne numeriche o nelle colonne caratteri e fa la cosa "giusta". Inserendo un NaN in una colonna numerica e una stringa vuota "" in una colonna di caratteri.
Ri: JMP18: python: la conversione da panda a dataTable salta le colonne con valori mancantiLa risposta breve è che is_string_dtype( col3 ) restituisce False. Non è una colonna di stringhe, è una colonna di oggetti, alcuni sono stringhe altri sono NaN. Il codice precedente tratta tutto ciò che non è una stringa come numerico. I NaN vengono correttamente inseriti come mancanti, ma i valori dei caratteri "c" ed "e" non sono validi per una colonna numerica e diventano valori mancanti. Sto cercando una risposta migliore sulla lettura della colonna dei panda come personaggio, senza testare ogni valore.