Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 生成摘要(“透视”)表_Python_Sqlite - Fatal编程技术网

Python 生成摘要(“透视”)表

Python 生成摘要(“透视”)表,python,sqlite,Python,Sqlite,我想要一种汇总数据库表的方法,以便将共享公共ID的行汇总为一行输出 我的工具是SQLite和Python2.x 例如,下面是我当地超市的水果价格表 +--------------------+--------------------+--------------------+ |Fruit |Shop |Price | +--------------------+--------------------+---

我想要一种汇总数据库表的方法,以便将共享公共ID的行汇总为一行输出

我的工具是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              |
+--------------------+--------------------+--------------------+
。。。我想制作一个汇总表,显示每个超市每种水果的价格。空格应由空字符填充

+----------+----------+----------+----------+
|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    |
+----------+----------+----------+----------+
我相信文献称之为pivot表或pivot查询,但显然该问题的解决方案使用了硬编码的左连接。这对我来说并不吸引,因为我事先不知道列名


现在我用Python迭代整个表并积累一个dict,这有点笨拙。我愿意使用更好的解决方案,无论是Python还是SQLite,都可以以表格形式提供数据。

在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)
输出:


熊猫包可以很好地处理这个问题

>>> 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
文件:

一些IPython笔记本学习熊猫:

希望这会有所帮助。 当做
帕特里克·布罗克曼(Patrick Brockmann)

itertools魔术是我最喜欢的一种魔术。希望其他人发布一个SQLite解决方案,但这已经比我之前做的要好了。@Li aungYip SQLite中有pivot表,因此stackoverflow上有大约1000个问题询问如何做到这一点。但有一个例子可以做到这一点,我最后用它编写了一个函数,创建了如上所述的透视表,然后将其作为临时表写回数据库。这使您可以对数据透视进行进一步的查询、联接等。临时表很难看,但如果它很蠢并且有效,它就不蠢了。@Li aungYip这也是SQLite::VirtualTable::Pivot所做的。但是我不是一个perl迷,所以我希望你能和全世界分享你的代码:-它是。。。难以置信的丑陋。如果我记得的话,我以后会把它发布在代码复查堆栈交换上。
>>> 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