从SQL Server获取数字列表,并使用它从pandas dataframe获取唯一值

时间:2017-11-29 19:32:23

标签: python sql-server pandas pyodbc

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

  1. 我有一个包含20列的pandas数据帧'df'。 'ISBN-13'就是其中之一。
  2. 我们的SQL服务器数据库'Book_records'有一个包含'Isbn13'列的表,其中包含与pandas数据帧中的'ISBN-13'类似的ID。
  3. 我的目标是从pandas数据框中获取我们的SQL服务器数据库中不存在的记录(行)

    我试过这样做:

    使用以下内容从我的SQL数据库中获取“Isbn13”数字列表到pandas。

    extension Dictionary {
        var jsonData: Data? {
            return try? JSONSerialization.data(withJSONObject: self)
        }
    }
    

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

    let dictionary = ["http://www.somehost.com":
        ["some_name", "some_pass", "date_modification", "other_stuff"]]
    
    if let jsonData = dictionary.jsonData {
        print(String(data: jsonData, encoding: .utf8) ?? "")  // {"http:\/\/www.somehost.com":["some_name","some_pass","date_modification","other_stuff"]}
        do {
            let dictionaty = (try JSONSerialization.jsonObject(with: jsonData)) as? [String:[String]]
            print(dictionary)  // ["http://www.somehost.com": ["some_name", "some_pass", "date_modification", "other_stuff"]]
        } catch {
            print(error)
        }
    }
    

    我的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() 并且会包含isbn13_list[1:4] [(u'9780004707631', ), (u'9780004812595', ), (u'9780006485131', )]

    等元素

    当我运行以下程序来获取新值时,我们的数据库没有出现,我得到了所有错误的值(我检查过我应该减少200个值)

    Name: ISBN-13, Length: 821, dtype: float64

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

2 个答案:

答案 0 :(得分:0)

  

我收到了,我认为是列表

没有。 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存储为字符串而不是浮点值,那可能会更好。)

答案 1 :(得分:0)

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

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