Dans un travail explicatif rapide, IndexedTables
semble beaucoup plus rapide que DataFrames
pour travailler sur des éléments individuels (par exemple sélectionner ou "mise à jour"), mais DataFrames
ont un meilleur écosystème de fonctionnalités, par ex. tracer, exporter ..Comment convertir un IndexedTable en un DataFrame dans Julia?
Ainsi, à un certain point du flux de travail, je voudrais convertir l'IndexedTable à un DataFrame, par exemple.
using DataFrames, IndexedTables, IndexedTables.Table
tn = Table(
Columns(
param = String["price","price","price","price","waterContent","waterContent"],
item = String["banana","banana","apple","apple","banana", "apple"],
region = Union{String,DataArrays.NAtype}["FR","UK","FR","UK",NA,NA]
),
Columns(
value2000 = Float64[2.8,2.7,1.1,0.8,0.2,0.7],
value2010 = Float64[3.2,2.9,1.2,0.8,0.2,0.8],
)
)
à >>
df_tn = DataFrame(
param = String["price","price","price","price","waterContent","waterContent"],
item = String["banana","banana","apple","apple","banana", "apple"],
region = Union{String,DataArrays.NAtype}["FR","UK","FR","UK",NA,NA],
value2000 = Float64[2.8,2.7,1.1,0.8,0.2,0.7],
value2010 = Float64[3.2,2.9,1.2,0.8,0.2,0.8],
)
ou
t = Table(
Columns(
String["price","price","price","price","waterContent","waterContent"],
String["banana","banana","apple","apple","banana", "apple"],
Union{String,DataArrays.NAtype}["FR","UK","FR","UK",NA,NA]
),
Columns(
Float64[2.8,2.7,1.1,0.8,0.2,0.7],
Float64[3.2,2.9,1.2,0.8,0.2,0.8],
)
)
à >>
df_t = DataFrame(
x1 = String["price","price","price","price","waterContent","waterContent"],
x2 = String["banana","banana","apple","apple","banana", "apple"],
x3 = Union{String,DataArrays.NAtype}["FR","UK","FR","UK",NA,NA],
x4 = Float64[2.8,2.7,1.1,0.8,0.2,0.7],
x5 = Float64[3.2,2.9,1.2,0.8,0.2,0.8]
)
je peux trouver l'individu "ligne" des valeurs d'interaction sur la table avec pair()
:Je ne peux cependant pas obtenir les noms et les types des colonnes, et je suppose que travailler par colonne serait plutôt plus efficace.
EDIT: J'ai réussi à obtenir les types "colonne" avec le code ci-dessus, je dois tout à l'heure pour obtenir les noms de colonnes, le cas échéant:
colTypes = Union{Union,DataType}[]
for item in tn.index.columns
push!(colTypes, eltype(item))
end
for item in tn.data.columns
push!(colTypes, eltype(item))
end
EDIT2: Comme l'a demandé, ceci est un exemple d'IndexedTable qui échouerait la conversion des noms de colonnes en utilisant la réponse (actuelle) Dan Getz, car les colonnes "index" sont nommées tuple mais les colonnes "data" sont des tuples normaux:
t_named_idx = Table(
Columns(
param = String["price","price","price","price","waterContent","waterContent"],
item = String["banana","banana","apple","apple","banana", "apple"],
region = Union{String,DataArrays.NAtype}["FR","UK","FR","UK",NA,NA]
),
Columns(
Float64[2.8,2.7,1.1,0.8,0.2,0.7],
)
)
Le problème semble être dans l'API IndexedTable, et en particulier dans la fonction columns(t)
, qui ne fait pas la distinction entre l'index et les valeurs.
Il fonctionne plus vite que ma solution (microsecondes aussi pour les grands ensembles de données) et est évidemment beaucoup plus élégant, mais quand un seul {index, data} est un NamedTuple, toutes les colonnes sont converties en noms xi. En général, cette réponse enseigne qu'il est préférable de regarder l'api d'un module plutôt que de tenter de jouer avec ses intérieurs en jetant une objection. – Antonello
J'ai remarqué le problème avec les tuples mixtes nommés et non-nommés, et en fait, une itération plus tôt de la solution a bien géré ceci. Cette solution pourrait également être modifiée un peu pour la gérer. Je vais regarder. –
Ajout d'un EDIT à la réponse pour gérer le cas mixte. –