2016-02-13 1 views
-1

Мне нужна ваша помощь в этой сложной проблеме. У меня есть результат SQL-запроса с одним столбцом и 1000 строками. Этот SQL-запрос на самом деле является запросом self join в таблице, и 1000 фактически являются 10 наборами из того же 100 id s. So the question is: How can I change the dimensions of this SQL query result in order to process it with pandas dataFrame? I know that pandas dataframes are always 2d and I can t use pandas.pivot, потому что у меня нет уникальных индексов.SQL-запрос 1 col & 1000 строк в pandas dataframe 10 cols & 100 rows

EDIT1:

Пример того, что я хочу сделать.

SQL-запрос результата

1 столбец и строки N1 к N1000

Необходимое dataframe

Колонки: Столбец1/Столбец2/Столбец3/column4/(и так далее)

Строки: от N1 до N100/N101 до N200/N201 до N300/N301 до N400/(и т. Д.)

EDIT2: Небольшой пример со значениями. Запрос SQL основан на самосоединении на таблице из 5 человек и их возрасте. Значения в запросе - это возрастные различия между двумя людьми каждый раз.

SQL-запрос

Разница Возраст

N1 (= Разница в возрасте между Person 1 и лица 1)

N2 (= Разница в возрасте между Person 1 и лица 2)

N3 (= разница в возрасте между Лицом 1 и Лицом 3)

Н4 (= Разница в возрасте между Person 1 человеком 4)

Н5 (= Разница в возрасте между лицом 1 человеком 5)

N6 (= разница в возрасте между Person 2 и лицами 1)

N7 (= разница между Возраст человека 2 человека 2)

N8 (= разница между Возраст человека 2 человека 3)

Н9 (= разница между Возраст человека 2 человека 4)

N10 (= Возрастная разница между Лицом 2 и Лицом 5)

...

N25 (= разница в возрасте между 5 и лица человека 5)

Необходимое dataframe

Person1 ---- Person2 ----- Person3 ---- - Person4 ----- Person5

N1 ------------- N6-- ----------- N11 ------------- N16 ------------- N21

N2 ----- -------- N7 ------------- ------------- N12 N17 ------------- N22

N3 ------------- N8 ------------- N13 ------------- N18-- ----------- N23

N4 ------------- N9 ------------- N14 ----- -------- N19 ------------- N24

N5 ------------- N10 -------- ---- N15 ------------- N20 ------------- N25

+0

Является ли ваш "результат запроса SQL" объект питона? Какой тип? – Goyo

+0

Нет. Я хотел знать все способы изменить свой результат, прежде чем использовать, например, панды или numpy. – lios

ответ

1

Трудно понять вашу задачу, но вот простой пример, это дает вы начать с:

>>> import sqlite3 
>>> conn = sqlite3.connect(':memory:') 
>>> conn.execute('create table test (id int, value int)') 
>>> conn.execute('insert into test select 1, 1 union all select 2, 2') 
>>> df = pd.read_sql('select t1.id, t2.id, t1.value * t2.value from test as t1 cross join test as t2', conn) 
>>> df 
    id1 id2 value 
0 1 1  1 
1 1 2  2 
2 2 1  2 
3 2 2  4 
>>> df.columns = ['id1','id2','value'] 
>>> df.pivot(index='id1', columns='id2') 
    value 
id2  1 2 
id1   
1  1 2 
2  2 4 

редактировать

>>> conn.execute('insert into ages select 6 union all select 24 union all select 14 union all select 16 union all select 65') 
>>> df = pd.read_sql('select t1.age - t2.age from ages as t1 cross join ages as t2', conn) 
>>> df.column = ['diff'] 
>>> a = pd.DataFrame.from_records(product(range(5), range(5)), columns=['a','b']) 
>>> res = pd.concat([df, a],axis=1) 
>>> res.pivot(index='a', columns='b', values='diff') 
b 0 1 2 3 4 
a      
0 0 -18 -8 -10 -59 
1 18 0 10 8 -41 
2 8 -10 0 -2 -51 
3 10 -8 2 0 -49 
4 59 41 51 49 0 
+0

Я вижу, что вы сделали, но ваш результат немного отличается в логике, чем то, что я хочу. Я редактировал свой вопрос на примере того, что мне нужно. Я попытался использовать pivot, как вы предложили, и я получаю сообщение об ошибке либо ValueError: не может пометить индекс нулевым ключом (хотя это не null), либо ValueError: индекс содержит повторяющиеся записи, не может быть изменен. – lios

+0

Зачем вам это нужно? Просто выберите один набор идентификаторов из базы данных, а затем продублируйте его. –

+0

Поскольку значения N1-N1000 отличаются друг от друга. – lios

Смежные вопросы