JMP18: Python: Konvertierung von Pandas in DataTable überspringt Spalten mit fehlenden Wertenimport 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);Verwenden Sie den obigen Code, um eine CSV-Datei einzulesen. Die p2j-Funktion scheint col3 nicht korrekt zu importieren, da Werte fehlen

Inhalt der CSV-Datei
"Spalte1", "Spalte2", "Spalte3"
"ABC"
"a","b",""
"ein", "b", "e"
"a","b",""
Automatisierung und SkriptingBetreff: JMP18: Python: Konvertierung von Pandas in DataTable überspringt Spalten mit fehlenden WertenDie Verwendung des obigen p2j( ) und einer aktualisierten Datei export.csv mit einer Spalte numerischer Daten, die als ersten Wert einen fehlenden Wert hat, ergibt Folgendes:

% mehr ~/Downloads/export.csv
"Spalte1", "Spalte2", "Spalte3", "Spalte4"
"ABC",
"a","b","",2.718
"a","b","e",1.618
"a","b","",3.14159
Betreff: JMP18: Python: Konvertierung von Pandas in DataTable überspringt Spalten mit fehlenden WertenHier wird der aktualisierte Code angezeigt. Wenn der Spaltentyp nicht numerisch oder eine Zeichenfolge ist, wird geprüft, bis wir einen nicht fehlenden Wert erhalten, bevor der Spaltentyp als Zeichen oder numerisch bestimmt wird.
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);
Dies führt zu den Ergebnissen:
/*:
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]
Beachten Sie, dass ich in meiner Funktion das numerische NaN in None konvertiert habe. Der JMP DataTable-Code akzeptiert None sowohl in numerischen als auch in Zeichenspalten und macht das „Richtige“. Indem er ein NaN in eine numerische Spalte und eine leere Zeichenfolge „“ in eine Zeichenspalte einfügt.
Betreff: JMP18: Python: Konvertierung von Pandas in DataTable überspringt Spalten mit fehlenden WertenDie kurze Antwort ist, dass is_string_dtype( col3 ) False zurückgibt. Es ist keine Zeichenfolgenspalte, sondern eine Spalte mit Objekten, einige sind Zeichenfolgen, einige sind NaN. Der obige Code behandelt alles, was keine Zeichenfolge ist, als numerisch. Die NaNs werden ordnungsgemäß als fehlend eingetragen, aber die Zeichenwerte „c“ und „e“ sind für eine numerische Spalte ungültig und werden zu fehlenden Werten. Ich suche nach einer besseren Antwort zum Lesen der Pandas-Spalte als Zeichen, ohne jeden Wert zu testen.