【问题标题】:Why I'm not recovering in python variables the same counts as SQL from table为什么我没有在 python 变量中恢复与表中的 SQL 相同的计数
【发布时间】:2014-11-29 23:48:20
【问题描述】:

这是我在 Stack Overflow 上的第一篇文章,我尽量做到简洁。 我在 SQL 方面有一些经验,但我才刚刚开始编写 python 代码。 我在 python 变量中获取 SQL 数据的结果很奇怪,似乎我做错了我找不到的事情。

如 SQL 查询所示,我的 SQLite 表有 26244 行:

table = 'DatosLaboratorio' 
SQLQuery = "SELECT COUNT(*) FROM %s" % table
rows = cursor.execute(SQLQuery).fetchone()[0]
print(rows)

26244

但是,当我尝试汇总表格时,python 并没有恢复相同的数字:

SQLQuery = "SELECT familia, COUNT(*) as num FROM %s GROUP BY familia ORDER BY familia" % table
rows = cursor.execute(SQLQuery).fetchall()
conn.commit()
# sum totals previously grouped in field 1 (num)
count=0
for row in rows:
    count=count+row[1]
print(count)

8862

我已经验证了针对 SQLite 的直接 SQL 查询给出了正确的数字:

select sum(num) as total from 
(select familia, count (*) as num from DatosLaboratorio group by familia)

total 
26244

更糟糕的是,当我尝试使用 pandas 在 DataFrame 中获取数据时,我没有得到相同的计数,似乎 pandas 只读取了 33 个有效行,但我在所有 26244 条记录中都有值:

SQLQuery = "SELECT * FROM %s" % table
df = pd.read_sql (SQLQuery,conn)
conn.commit()
df.count()

ID                     33
seccion                 0
fecha                  33
familia                33
codigo                 33
extractoseco           33
materiagrasa           33
sal                    33
ph                     33
observaciones          33
phsalmuera              0
temperaturasalmuera     4
densidadsalmuera        4

我错过了什么?提前感谢您的帮助!


@Hrabal:添加输出

这是在 SQLite 上查询的 SQL 输出:

select familia, count (*) as num from DatosLaboratorio group by familia

RecNo   familia num
1   CABRA BARRA TIERNO  297
2   CABRA MADURADO 3 KG 29
3   CABRA MADURADO MINI 44
4   CABRA TIERNO 3 KGS  140
5   CABRA TIERNO BARRA 4,2  50
6   CABRA TIERNO MINI   258
7   GRAN CAPITAN 3 KGS  2
8   MADURADO 3 KG SL    2588
9   MADURADO 3 KGS IQM  315
10  MADURADO 3 KGS S/LIS    308
11  MADURADO 3KG CL 1229
12  MADURADO BARRA  1585
13  MADURADO BARRA 4,2  523
14  MADURADO BARRA IQM  60
15  MADURADO BARRA IQM 4,2  41
16  MADURADO MINI   1393
...
50  TIERNO MINI IQM 142
51  TIERNO MINI LIGHT   572
52  TIERNO PÑO  323
53  TIERNO PÑO IQM  2124
54  TIERNO SOJA 3 KGS   3
55  TIERNO SOJA BARRA   14
56  TIERNO SOJA MINI    4

所以结果是 56 行数据按“家庭”分组,并且 sum(“num”) = 26244

当我从 python 打印时,它似乎没有读取所有数据:

SQLQuery = "SELECT familia, COUNT(*) as num FROM %s GROUP BY familia ORDER BY familia" % table
rows = cursor.execute(SQLQuery).fetchall()
conn.commit()
columns = [column[0] for column in cursor.description]
print(columns)
for row in rows:
    print (row[0],row[1])

['familia', 'num']
CABRA BARRA TIERNO 297
CABRA MADURADO 3 KG 29
CABRA MADURADO MINI 44
CABRA TIERNO 3 KGS 140
CABRA TIERNO BARRA 4,2 50
CABRA TIERNO MINI 258
GRAN CAPITAN 3 KGS 2
MADURADO 3 KG SL 2588
MADURADO 3 KGS IQM 315
MADURADO 3 KGS S/LIS 308
MADURADO 3KG CL 1229
MADURADO BARRA 1585
MADURADO BARRA 4,2 523
MADURADO BARRA IQM 60
MADURADO BARRA IQM 4,2 41
MADURADO MINI 1393

这就是 python 正在读取的所有数据,显然:前 16 行,或者至少我无法获取其余数据。它应该读取 56 行。 而且 pandas 也不会读取所有数据。

【问题讨论】:

  • 只是猜测,但您想使用 row[0] 而不是 row[1]?如果不是这样,我肯定会从 python 打印行开始,看看这是否与处理零或缺失值有关。
  • 所有这些原始数据都有主键吗?我曾经在 sqlite 中遇到过一些奇怪的情况,其中一些行的主键为空并且输出错误。
  • 你能发一个select familia, count (*) as num from DatosLaboratorio group by familia的sn-p吗?来自直接 sqlite 查询和通过 python 的两个 autputs? tnx
  • @JohnE:起初我确实打印了所有结果,但由于可用空间,我没有将它们发布在这里。现在我添加了更详细的输出
  • @ustun:没有定义主键,实际上表根本没有键。

标签: python sql pandas


【解决方案1】:

我能想到的只是.fetchall().. 由于 python 只为您提供前 16 行,因此 fetchall() 无法正常工作,因此请尝试使用.fetchone()(如果您有一个小数据集)或带有.fetchmany() 的生成器:

def ResultGenerator(cursor, arraysize=8):
  while True:
    results = cursor.fetchmany(arraysize)
    if not results:
        break
    for result in results:
        yield result

cursor = con.cursor()
SQLQuery = "SELECT familia, COUNT(*) as num FROM %s GROUP BY familia ORDER BY familia" % table
cursor.execute(SQLQuery)

for row in ResultGenerator(cursor):
    print (row[0],row[1])

这种方式 python 一次只获取 8 行,消耗更少的内存(可能是这里的问题?)。

尝试使用 arraysize 变量,看看是否有变化。

资源: Python generators are fun

【讨论】:

  • Hrabal:你的代码可以工作,但我仍然得到 16 行,不管 arraysize 的大小。我测试了 8、16、32 和 56,我总是得到相同的结果:16 行。很奇怪。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-03
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多