【问题标题】:Get list of numbers from SQL server and use it to get unique values from pandas dataframe从 SQL Server 获取数字列表并使用它从 Pandas 数据框中获取唯一值
【发布时间】:2017-11-29 19:32:23
【问题描述】:

我正在尝试执行以下操作:

  1. 我有一个包含 20 列的 pandas 数据框“df”。 “ISBN-13”就是其中之一。
  2. 我们的 SQL Server 数据库“Book_records”有一个表,其“Isbn13”列包含类似于 Pandas 数据框中的“ISBN-13”的 ID。

我的目标是从我们的 SQL 服务器数据库中不存在的 pandas 数据框中获取记录(行)

我试过这样做:

使用以下命令将我的 SQL 数据库中的“Isbn13”数字列表导入 pandas。

cnxn = pyodbc.connect(driver='{SQL Server}', host=server, database=db1,trusted_connection=tcon)
cursor = cnxn.cursor()
cursor.execute("SELECT distinct(DBF.Isbn13) FROM Book_records as DBF")
isbn13_list = cursor.fetchall()

然后使用此列表,将其与 pandas 数据框 ISBN-13 值进行比较,消除那些已经存在于我们数据库中的值。 但是,当我运行它时。我得到了,我认为是一个列表列表如下

isbn13_list[1:4]
[(u'9780004707631', ), (u'9780004812595', ), (u'9780006485131', )]

我的 pandas 数据框列如下:Name: ISBN-13, Length: 821, dtype: float64 并且会有像 9780004707631.0 这样的元素

当我运行以下程序以获取未在我们的数据库中显示的新值时,我得到了所有错误的值(我检查了我应该少得到 200 个值)

Final_df = df[~df['ISBN-13'].isin(isbn13_list)]

我做错了什么?另外,我应该将我的 df 中的 ISBN-13 转换为 int 还是其他任何东西?

【问题讨论】:

  • 检查您的数据类型,全部设为 str 或全部为 int
  • isbn13_list 是否正确输出以使其适用于 Final_df 代码?此外,它需要大量的时间来运行。是因为 isbn13_list 的方式吗?

标签: python sql-server pandas pyodbc


【解决方案1】:

我得到了,我认为是列表列表

没有。 fetchall() 返回pyodbc.Row 对象的列表。如果您想要一个真实的float 值列表来过滤您的数据框,那么您需要将Row 对象列表转换为float 值列表,如下所示:

isbn13_rows = cursor.fetchall()  # [(u'9780004707631', ), (u'9780004812595', ), ...
isbn13_list = [float(x[0]) for x in isbn13_rows]  # [9780004707631.0, 9780004812595.0, ...

(顺便说一句,如果您的数据框将 ISBN 存储为字符串而不是浮点值可能会更好。)

【讨论】:

    【解决方案2】:

    这是我能够做到的解决方法。我以前尝试过的一切都很快。它可能不是最佳的,对此感到抱歉。

    cnxn = pyodbc.connect(driver='{SQL Server}', host=server, database=db1,trusted_connection=tcon)
    cursor = cnxn.cursor()
    cursor.execute("SELECT distinct(DBF.Isbn13) FROM Book_records as DBF")
    isbn13_list = pd.DataFrame.from_records(cursor.fetchall(),columns=['isbn13'])
    isbn13_list = isbn13_list['isbn13'].astype('int64')
    Final_df = condition_df[~condition_df['ISBN-13'].isin(isbn13_list)]
    

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 2022-10-13
      • 1970-01-01
      • 2010-09-13
      • 1970-01-01
      • 2023-01-23
      • 1970-01-01
      • 2020-10-23
      • 1970-01-01
      相关资源
      最近更新 更多