2016-02-13 96 views
-1

我需要你幫助解決這個棘手的問題。我有一個列和1000行SQL查詢結果。這個SQL查詢實際上是一個表上的自加入查詢,而1000實際上是10套相同的100個ID使用pandas.pivot,因爲我沒有唯一的索引。SQL query 1 col&1000 rows to pandas dataframe 10 cols&100 rows

編輯1:

我想要做的一個例子。

SQL查詢結果

1列和行N1至N1000

必要數據幀

列:列1 /列2 /欄3/Column4 /(等)

行數:N1至N100/N101至N200/N201至N300/N301至N400 /(依此類推)

EDIT2: 帶值的小示例。SQL查詢基於5人及其年齡的表上的自加入。查詢中的值是每次兩個人之間的年齡差異。

SQL查詢

年齡差

N1(=人1和Person 1之間年齡差)

N2(=人1和人2之間年齡差)

N3(=人1與人3之間的年齡差)

N4(=人1和人4之間年齡差)

N5(=人1和Person 5之間年齡差)

N6(=人2和Person 1之間年齡差)

N7 (=人2和Person 2之間年齡差)

N8(=人2和Person 3之間年齡差)

N9(=人2和Person 4之間年齡差)

N10(=第2個人和第5個人之間的年齡差異)

...

N25(人5和Person 5之間=年齡差)

必要數據幀

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查詢結果」 Python對象?什麼樣的? – 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:無法用空鍵(儘管它不爲空)或ValueError標記索引:索引包含重複條目,無法重新塑造。 – lios

+0

你爲什麼需要這樣做?只需從數據庫中獲取一組ID,然後複製它 –

+0

因爲值N1到N1000彼此都不相同。 – lios