2017-09-18 3 views
1

Je suis en train de créer une base de données SQLite avec pandas géants.pandas géants créer la base de données avec l'index

Je suis en mesure d'enregistrer les données avec:

from sqlalchemy import create_engine                                            
from sqlalchemy.orm import sessionmaker                                            
engine = create_engine(path, echo=False)                                           
df_flows.to_sql('flows', engine, if_exists='append', index=False, index_label='First')                               

et je peux le lire en arrière avec

df = pd.read_sql("SELECT * FROM flows WHERE First>1504101810 AND First<1504105409", engine)                               

Les données sont sur le disque, mais je pense que l'indexation ne fonctionne pas correctement comme:

In [22]: from sqlalchemy.engine import reflection                                         

In [23]: insp = reflection.Inspector.from_engine(engine)                                       

In [24]: insp.get_indexes('flows')                                             
Out[24]: [] 

maintenant, j'ai 2 questions:

1) Pourquoi la colonne First ne semble pas insp.get_indexes('flows')

2) Comment puis-je ajouter 1 ou plusieurs index à la base de données que j'ai créé.

EDIT:

Ceci est la structure de la trame de données

In [25]: df_flows.dtypes                                              
Out[25]:                                                  
Protocol  object                                              
Src    object                                              
SrcPort  float64                                              
Dst    object                                              
DstPort  float64                                              
Group ID   int64                                              
Port   object                                              
VPort   int64                                              
IP TOS   object                                              
VLAN ID  float64                                              
VLAN Pri  float64                                              
MPLS Exp  float64                                              
Application  object                                              
Packets   int64                                              
Messages   int64                                              
Bytes   int64                                              
First   int64                                              
Last    int64                                              
SrcSubnet  object                                              
DstSubnet  object                                              
dtype: object    

Répondre

0

Vous ne présentez pas la structure de votre dataframe, donc il est difficile de répondre à votre question. Cependant, compte tenu de vos contributions, je peux faire quelques inférences. Lorsque vous enregistrez votre base de données en SQL, vous définissez index=False.

Cela signifie que tout index de votre base de données n'est pas enregistré en tant que colonne dans la base de données. Vous allez ensuite attribuer une étiquette d'index qui n'aura aucun effet étant donné que vous avez défini l'index sur False. Ce paramètre est utilisé si vous souhaitez renommer votre nom d'index existant.

index: booléen, valeur par défaut True Ecriture d'un index DataFrame en tant que colonne. Index_label: chaîne ou séquence, valeur par défaut Aucune Libellé de colonne pour colonne (s) d'index. Si aucune est donnée (par défaut) et index est vrai, alors les noms d'index sont utilisés. Une séquence doit être donnée si le DataFrame utilise MultiIndex.

Un index de base de données devrait être créé à partir de la base de données, pas de pandas.

+0

donc vous dites que si 'index_label' n'est pas' None' alors l'index doit être défini sur True et il est automatiquement remplacé par le nom de colonne spécifié? – Donbeo

+0

Non. Je dis que 'index_label' est ignoré si' index = False'. Si 'index = True' (la valeur par défaut), il écrira l'index en tant que colonne en utilisant son nom. Cependant, vous pouvez utiliser un autre nom en utilisant le paramètre 'index_label'. – Alexander

+0

ok mais si je veux ajouter des index plus tard si je veux indexer par plusieurs colonnes? – Donbeo