【问题标题】:Converting query results into DataFrame in python在python中将查询结果转换为DataFrame
【发布时间】:2015-07-17 10:12:58
【问题描述】:

我正在尝试使用 psycog2 对查询结果执行操作。因此,我必须将结果转换为 pandas DataFrame。但是当我使用下面的代码并打印时,只打印列名而不打印行。我也使用了“pd.DataFrame.from_records”,但没有用。

import psycopg2
import pandas as pd
import numpy as np
conn_string = "Connect_Info"
conn = psycopg2.connect(conn_string)
cursor = conn.cursor()
cursor.execute(query)
rows=pd.DataFrame(cursor.fetchall(),columns=['page_num','Frequency'])

for row in rows:
   print row

conn.commit();
conn.close();

cursor.fetchall() 的结果 -

(1L, 90990L)
(3L, 6532L)
(2L, 5614L)
(4L, 4016L)
(5L, 2098L)
(6L, 1651L)
(7L, 1158L)
(8L, 854L)
(9L, 658L)
(10L, 494L)
(11L, 345L)
(12L, 301L)
(13L, 221L)
(15L, 152L)
(14L, 138L)
(16L, 113L)
(17L, 93L)
(18L, 73L)
(20L, 62L)
(19L, 55L)
(22L, 44L)
(21L, 35L)
(23L, 29L)
(25L, 24L)
(27L, 19L)
(26L, 18L)

【问题讨论】:

  • 你能把 cursor.fetchall() 的结果放在这里吗?
  • 你能打印 cursor.fetchall() 的输出吗?也不确定您是否可以通过这种方式遍历 DataFrame
  • 从 df 返回的迭代是列而不是行
  • 注1:为了获取数据,你最好使用read_sql_query,然后上面的一切就几乎变成了一条线(见我的回答)。
  • 注2:你能澄清一下你想做什么样的操作吗?在 DataFrame 的行上手动迭代不是很有效,并且在大多数情况下是不需要的(大多数操作可以使用矢量化方法完成)。

标签: python pandas dataframe psycopg2


【解决方案1】:

也许不能直接回答您的问题,但您应该使用 read_sql_query 来代替自己执行 fetchall 并包装在 DataFrame 中。这看起来像:

conn = psycopg2.connect(...)
rows = pd.read_sql_query(query, conn)

而不是上面的所有代码。

对于您的实际问题,请参阅 http://pandas.pydata.org/pandas-docs/stable/basics.html#iteration 以获取解释和不同选项。
基础是遍历数据框,遍历列名。要遍历行,您可以使用其他函数,例如 .iterrows() 和 .itertuples()。但请记住,在大多数情况下,不需要手动迭代行。

【讨论】:

  • 我正在学习 postgress 和 python。我必须制作一个涉及不同模块的许多查询的系统。对于这个问题,我正在尝试制作一个直方图,其中 x 轴作为第 1 列,y 作为查询结果的第 2 列。
【解决方案2】:

这正是迭代数据框时应该发生的情况,您会看到列名。如果您想查看 df,只需打印 df。要查看行:

for ind, row in df.iterrows(): 
    print(row.values)

或.values:

for row in df.values:
   print(row)

【讨论】:

  • 从技术上讲,一个由 (index, Series) 组成的元组是从 iterrows 返回的,所以如果你只想要行值,那么 for index, row in df.iterrows(): print(row) 会更好
  • @maggs 该行实际上是Series,因此您可以使用列名获取值,如果您只想要这些值,那么print(row.values) 将为您提供所需的内容
  • @EDChum 知道了。谢谢你的解释。
【解决方案3】:

另一个建议是使用 itertuples,它产生 (index, row_value1, row_value2...) 元组。

for tup in rows.itertuples():
    print tup

'(0, 1, 90990)
(1, 3, 6532)
(2, 2, 5614)
(3, 4, 4016)
...'

如您所见,第一个位置是索引,socend 是第一列的值,第二个是第二列的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-03
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-10-15
    • 2015-10-14
    • 2019-12-29
    相关资源
    最近更新 更多