2012-07-11 22 views
5

मुझे डेटाबेस तालिका को सारांशित करने का एक तरीका चाहिए ताकि एक सामान्य आईडी साझा करने वाली पंक्तियों को आउटपुट की एक पंक्ति में सारांशित किया जा सके।एक सारांश ("पिवट"?) तालिका बनाएं

मेरे उपकरण SQLite और Python 2.x हैं।

उदाहरण के लिए, अपने स्थानीय सुपरमार्केट में फल की कीमतों के निम्न तालिका दिया ...

+--------------------+--------------------+--------------------+ 
|Fruit    |Shop    |Price    | 
+--------------------+--------------------+--------------------+ 
|Apple    |Coles    |$1.50    | 
|Apple    |Woolworths   |$1.60    | 
|Apple    |IGA     |$1.70    | 
|Banana    |Coles    |$0.50    | 
|Banana    |Woolworths   |$0.60    | 
|Banana    |IGA     |$0.70    | 
|Cherry    |Coles    |$5.00    | 
|Date    |Coles    |$2.00    | 
|Date    |Woolworths   |$2.10    | 
|Elderberry   |IGA     |$10.00    | 
+--------------------+--------------------+--------------------+ 

... मैं मुझे हर सुपरमार्केट में प्रत्येक फल की कीमत दिखा एक सारांश तालिका का उत्पादन करना चाहते हैं। रिक्त स्थान एनयूएलएल द्वारा भरा जाना चाहिए।

+----------+----------+----------+----------+ 
|Fruit  |Coles  |Woolworths|IGA  | 
+----------+----------+----------+----------+ 
|Apple  |$1.50  |$1.60  |$1.70  | 
|Banana |$0.50  |$0.60  |$0.70  | 
|Cherry |NULL  |$5.00  |NULL  | 
|Date  |$2.00  |$2.10  |NULL  | 
|Elderberry|NULL  |NULL  |$10.00 | 
+----------+----------+----------+----------+ 

मेरा मानना ​​है कि साहित्य यह एक "पिवट तालिका" या एक "धुरी क्वेरी" कहता है, लेकिन जाहिरा तौर पर SQLite doesn't support PIVOT. (है कि प्रश्न में समाधान हार्डकोडेड LEFT JOIN रों उपयोग करता है। यह वास्तव में मेरे लिए अपील नहीं करता है क्योंकि मैं डॉन अग्रिम में "कॉलम" नामों को नहीं जानते हैं।)

अभी मैं पाइथन में पूरी तालिका के माध्यम से इसे फिर से चलाकर dicts को जमा करता हूं, जो थोड़ा सा है। मैं बेहतर समाधान के लिए खुला हूं, या तो पायथन या SQLite में, जो डेटा को टैब्यूलर रूप में देगा।

उत्तर

8

अजगर पक्ष पर, आप अपने डेटा उलटफेर के लिए कुछ itertools जादू इस्तेमाल कर सकते हैं:

data = [('Apple',  'Coles',  1.50), 
     ('Apple',  'Woolworths', 1.60), 
     ('Apple',  'IGA',  1.70), 
     ('Banana',  'Coles',  0.50), 
     ('Banana',  'Woolworths', 0.60), 
     ('Banana',  'IGA',  0.70), 
     ('Cherry',  'Coles',  5.00), 
     ('Date',  'Coles',  2.00), 
     ('Date',  'Woolworths', 2.10), 
     ('Elderberry', 'IGA',  10.00)] 

from itertools import groupby, islice 
from operator import itemgetter 
from collections import defaultdict 

stores = sorted(set(row[1] for row in data)) 
# probably splitting this up in multiple lines would be more readable 
pivot = ((fruit, defaultdict(lambda: None, (islice(d, 1, None) for d in data))) for fruit, data in groupby(sorted(data), itemgetter(0))) 

print 'Fruit'.ljust(12), '\t'.join(stores) 
for fruit, prices in pivot: 
    print fruit.ljust(12), '\t'.join(str(prices[s]) for s in stores) 

आउटपुट:

Fruit  Coles  IGA  Woolw 
Apple  1.5  1.7  1.6 
Banana  0.5  0.7  0.6 
Cherry  5.0  None None 
Date   2.0  None 2.1 
Elderberry None  10.0 None 
+0

'itertools' जादू मेरा पसंदीदा जादू है। किसी और की उम्मीद करना एक SQLite समाधान पोस्ट करेगा, लेकिन यह पहले से ही बेहतर है जो मैं कर रहा था। –

+0

@ ली-ऑंगवाईप एसक्यूलाइट में पिवट टेबल के लिए [कोई समर्थन नहीं] [http://www.sqlite.org/cvstrac/tktview?tn=1424) है, इसलिए स्टैक ओवरफ्लो पर ~ 1000 प्रश्न यहां पूछने के लिए कह रहे हैं। लेकिन एक [पर्ल मॉड्यूल] है (https://github.com/bduggan/SQLite-VirtualTable-Pivot) जो कि एक उदाहरण के साथ [यहां] (http://search.cpan.org/~bduggan/SQLite- VirtualTable धुरी-0.02/lib/SQLite/VirtualTable/Pivot.pm)। – sloth

+0

मैंने इस फ़ंक्शन को लिखने के लिए इसका उपयोग समाप्त कर दिया जो उपरोक्त के रूप में पिवट तालिका बनाता है) और फिर इसे अस्थायी तालिका के रूप में डेटाबेस में वापस लिखता है। यह आपको मुख्य डेटा पर आगे के प्रश्न ('जॉइन, इत्यादि) करने देता है। अस्थायी सारणी बदसूरत हैं क्योंकि सभी बाहर निकलते हैं, लेकिन "अगर यह बेवकूफ है और यह काम करता है, तो यह बेवकूफ नहीं है।" –

12

पांडा पैकेज यह बहुत अच्छी तरह से संभाल सकते हैं।

>>> import pandas 
>>> df=pandas.DataFrame(data, columns=['Fruit', 'Shop', 'Price']) 
>>> df.pivot(index='Fruit', columns='Shop', values='Price') 
Shop  Coles IGA Woolworths 
Fruit        
Apple   1.5 1.7   1.6 
Banana  0.5 0.7   0.6 
Cherry  5.0 NaN   NaN 
Date   2.0 NaN   2.1 
Elderberry NaN 10.0   NaN 

प्रलेखन: http://pandas.pydata.org/pandas-docs/stable/reshaping.html

कुछ IPython नोटबुक पांडा जानने के लिए: https://bitbucket.org/hrojas/learn-pandas

आशा में मदद मिलेगी।
सम्मान
पैट्रिक ब्रॉकमैन

संबंधित मुद्दे