La sélection des colonnes à partir des pandas.HDFStore table
Comment puis-je récupérer des colonnes spécifiques à partir d'une pandas HDFStore? J'ai l'habitude de travailler avec de très grands ensembles de données qui sont trop gros pour manipuler en mémoire. Je voudrais lire dans un fichier csv de façon itérative, ajoutez chaque morceau en HDFStore objet, et ensuite travailler avec des sous-ensembles de données. J'ai lu dans un simple fichier csv et chargé dans un HDFStore avec le code suivant:
tmp = pd.HDFStore('test.h5')
chunker = pd.read_csv('cars.csv', iterator=True, chunksize=10, names=['make','model','drop'])
tmp.append('df', pd.concat([chunk for chunk in chunker], ignore_index=True))
Et la sortie:
In [97]: tmp
Out[97]:
<class 'pandas.io.pytables.HDFStore'>
File path: test.h5
/df frame_table (typ->appendable,nrows->1930,indexers->[index])
Ma Question est comment puis-je accéder à des colonnes spécifiques de tmp['df']
? La documenation fait mention d'un select()
méthode et un peu de Term
objets. Les exemples fournis sont appliqués à des données de Panel; cependant, et je suis trop novice pour l'étendre à la plus simple bloc de données de cas. Ma conjecture est que je dois créer un index des colonnes en quelque sorte. Merci!
OriginalL'auteur Zelazny7 | 2012-12-18
Vous devez vous connecter pour publier un commentaire.
La façon HDFStore enregistrements de tables, les colonnes sont stockés par type comme de simples tableaux numpy. Vous avez toujours récupérer toutes les colonnes, vous pouvez filtrer sur eux, de sorte que vous serez renvoyé pour ce que vous demandez. Dans 0.10.0 vous pouvez passer d'un Terme qui implique des colonnes.
ou vous pouvez indexer ensuite
La
axes
n'est pas vraiment la solution ici (ce que vous avez réellement créé était en effet le stockage d'un transposée cadre). Ce paramètre vous permet de re-commander le stockage des axes pour permettre l'alignement des données de différentes façons. Pour un dataframe il n'a vraiment pas beaucoup de sens; pour la 3d ou 4d structures, sur disque alignement des données est cruciale pour vraiment rapide des requêtes.0.10.1 l'a permettra une solution plus élégante, à savoir les colonnes de données, qui est, vous pouvez choisir certaines colonnes d'être représentés comme il y propre colonnes dans la table du magasin, vous pouvez sélectionner uniquement. Voici un avant-goût de ce qui est à venir.
Un autre moyen de le faire aller à ce sujet est de stocker des tables distinctes dans différents noeuds du fichier, vous pouvez sélectionner uniquement ce dont vous avez besoin.
En général, je recommande encore une fois très grandes tables. hayden offre la solution de Panneau, qui peut être un avantage pour vous maintenant, car les données réelles arangement doit refléter la façon dont vous voulez interroger les données.
0.10.1 l'a prend en charge les données des colonnes; ce que les questions r u avoir?
Je pense que nous devrions mettre à jour ce pour éviter toute confusion, Jeff?
OriginalL'auteur Jeff
Vous pouvez stocker le dataframe avec un index des colonnes comme suit:
puis sélectionnez l'option à laquelle vous vous attendiez:
Où:
.
Pour moi, ce n'est pas une solution idéale, puisque l'on ne peut l'indexation du DataFrame par une chose! Il est inquiétant de les docs semblent suggérer que vous peut seul indice un DataFrame par une chose, au moins à l'aide
axes
:J'ai peut-être la lecture de cette manière incorrecte, auquel cas j'espère que quelqu'un peut me prouver le contraire!
.
Note: Une façon que j'ai trouvée à l'index d'un DataFrame par deux choses (index et de colonnes), consiste à convertir un Panneau, qui peut ensuite récupérer à l'aide de deux indices. Cependant, alors nous devons convertir les choix d'une page d'un DataFrame chaque fois que les éléments sont récupérés... encore une fois, pas l'idéal.
voir ma réponse ci-dessous; votre sont essentiellement le stockage d'un transposée images. les axes argument n'est pas nécessaire ici
La plupart des choses dans cet exemple fonctionne pour moi, sauf que cette ligne:
store.append('df_cols', df, axes='columns')
Il déclenche l'erreurValueError: No axis named c for object type <class 'pandas.core.frame.DataFrame'>
Si vous remplacez cette ligne par:store.append('df_cols', df, data_columns=True)
alors l'erreur disparaît et le reste de l'exemple fonctionne.comme Jeff dit ci-dessus, les axes argument n'est pas nécessaire. Je pense que c'est vraiment obsolète (et retiré) depuis cette réponse a été posté... :s Merci!
OriginalL'auteur Andy Hayden