7

共通のIDを共有する行が1行の出力に要約されるように、データベーステーブルを要約する方法が必要です。

私のツールはSQLiteとPython2.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              |
+--------------------+--------------------+--------------------+

...各スーパーマーケットでの各果物の価格を示す要約表を作成したいと思います。空白はNULLで埋める必要があります。

+----------+----------+----------+----------+
|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はサポートしていないようPIVOTです。(その質問の解決策はハードコードされたLEFT JOINsを使用します。「列」の名前が事前にわからないため、これは私にはあまり魅力的ではありません。)

今のところ、Pythonでテーブル全体を反復処理し、のを累積することdictdictsこれを実行します。これは少し厄介です。私は、PythonまたはSQLiteのいずれかで、データを表形式で提供するより優れたソリューションを受け入れています。

4

2 に答える 2

13

pandasパッケージはこれを非常にうまく処理できます。

>>> 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

それがお役に立てば幸いです。
よろしく
パトリックブロックマン

于 2013-09-12T13:20:15.440 に答える
8

Python側では、データを再配置するためにいくつかの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
于 2012-07-11T08:59:57.770 に答える