2015-04-03 4 views
1

Je lis une table SQLite créée par un programme sur lequel je n'ai aucun contrôle.Recomposer une table à partir d'un SQL avec un identifiant de ligne et de colonne en Python

L'idée derrière la mise en page de cette table SQL m'échappe, mais c'est comme ça.

Ce tableau se présente comme suit dans SQL:

SQL Table

Qu'est-ce qu'il est vraiment, et ce que je voudrais mettre en dataframe python-pandas géants est la suivante:

Equivalent HTML table

Jusqu'ici, cette seule façon de penser à cela est d'obtenir une liste de RowID, de les boucler et de reconstruire la table. Mais je me demande s'il y a un moyen plus facile et plus rapide (la base de données est énorme), que ce soit en faisant l'instruction SELECT ou plus tard sur la trame de données pandas elle-même.

Pour charger les données que je utilise:

import pandas as pd 
import sqlite3 

con = sqlite3.connect(sql_path) 
#Simplified here, to produce the Table I filter on a few things 
df = pd.read_sql('SELECT * from Table',con=con, index_col='RowID') 

J'ai désespérément essayé et ne pouvait pas utiliser un tas de choses, y compris pd.pivot ou pd.groupby mais il pourrait juste être parce que je n » Je sais comment l'utiliser correctement.

Version:

Python: 2.7.8 | Pandas: 0.16.0 | sqlite3: 2.6.0

Répondre

1

Il suffit de définir l'index et de le désempiler. Vous pouvez utiliser 'rowid' au lieu de 'rowname' ou inclure les deux dans l'index si vous ne voulez pas laisser l'un ou l'autre, mais c'est redondant aussi loin que la solution.

df = pd.DataFrame({ 'rowname':[1,1,2,2], 'colname':[1,2,1,2], 'values':['a11','a12','a21','a22'] }) 

df 
    colname rowname values 
0  1  1 a11 
1  2  1 a12 
2  1  2 a21 
3  2  2 a22 

df.set_index(['rowname','colname']).unstack() 

     values  
colname  1 2 
rowname    
1   a11 a12 
2   a21 a22