如何检查 2 列之间有差异的 df 行,然后将其发送到另一个 table 以验证信息
How to check df rows that has a difference between 2 columns and then send it to another table to verify information
我是 python 的新手,最近几天我非常努力地研究如何逐行查看 df,并检查 dQ 和 dCQ 列之间有差异的每一行。我只是说 != 0 因为可能有正值或负值。现在,如果这是真的,我想检查另一个 table 是否满足某些条件。我习惯于在 R 中工作,在那里我可以将 df 存储到一个变量中并调用列名,但我似乎无法在 python 中找到一种方法来做到这一点。我发布了我一直在玩的所有代码。我知道这很麻烦,但我们将不胜感激。谢谢!
我试过安装不同的包,但这些包不起作用,我试过制作一个 for 循环(我惨败),也许是一个函数?我什至不知道去哪里看。我从来没有学过 Python,我真的尽我最大的努力在线观看视频并在这里阅读。
import pyodbc
import PyMySQL
import pandas as pd
import numpy as np
conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};"
"Server=***-***-***.****.***.com;"
"Database=****;"
"Trusted_Connection=no;"
"UID=***;"
"PWD=***")
# cur = conn.cursor()
# cur.execute("SELECT TOP 1000 tr.dQ, po.dCQ,
tr.dQ - po.dCQ as diff FROM [IP].[dbo].
[vT] tr (nolock) JOIN [IP].[dbo].[vP] po
ON tr.vchAN = po.vchCustAN WHERE tr.dQ
!= po.dCQ")
# query = cur.fetchall()
query = "SELECT TOP 100 tr.dQ, po.dCQ/*, tr.dQ -
po.dCQ as diff */FROM [IP].[dbo].[vT]
tr (nolock) INNER JOIN [IP].[dbo].[vP] po ON
tr.vchAN = po.vchCustAN WHERE tr.dQ !=
po.dCQ"
df = pd.read_sql(query, conn)
#print(df[2,])
cursor = conn.cursor(PyMySQL.cursors.DictCursor)
cursor.execute("SELECT TOP 100 tr.dQ, po.dCQ/*,
tr.dQ - po.dCQ as diff */FROM [IP].[dbo].
[vT] tr (nolock) INNER JOIN [IP].[dbo].
[vP] po ON tr.vchAN = po.vchCustAN
WHERE tr.dQ != po.dCQ")
result_set = cursor.fetchall()
for row in result_set:
print("%s, %s" % (row["name"], row["category"]))
# if df[3] != 0:
# diff = df[1]-df[2]
# print(diff)
# else:
# exit
# cursor = conn.cursor()
# for row in cursor.fetchall():
# print(row)
#
# for record in df:
# if record[1] != record[2]:
# print(record[3])
# else:
# record[3] = record[1]
# print(record)
# df['diff'] = np.where(df['dQ'] != df["dCQ"])
我希望收到某种通知,指出第 xx 行存在差异,现在它将检查 table vP 以验证我们是否收到了此数据的详细信息。我相信我能做到这一点,如果我能让第一部分工作的话。任何帮助表示赞赏。如果这个问题不清楚,我很抱歉,我会尽力回答别人可能提出的任何问题。谢谢!
一种解决方案是创建一个新列,用于存储 df[1] 和 df[2] 之间的差异结果。先记一个。在制作 df 时命名列可能更精确,然后使用 df['name1'] 和 df['name2'] 引用它们,或者使用 df.iloc[:,1]和 df.iloc[:,2]。另请注意,列号从零开始,因此它们指的是 df 中的第二列和第三列。使用 iloc 的原因是冒号是为了明确声明您想要所有行号和列号 1 和 2。否则,如果您的 df 被转置,则使用 df[1] 或 df[2] 可能实际上指的是您认为是索引。现在,开始解决方案。
你可以试试
df['diff']=df.iloc[:,1]-df.iloc[:,2]
df['diff_bool']=np.where(df['diff']==0,False, True)
或者您可以将其合并为一个方法
df['diff_bool']==np.where(df.iloc[:,1]-df.iloc[:,2]==0,False, True)
这将在您的 df 中创建一个列,说明第一列和第二列之间是否存在差异。你实际上不需要逐行循环,因为 pandas 函数像矩阵数学一样工作,所以 df.iloc[:,1]-df.iloc[:,2] 将应用减法自动逐行。
我是 python 的新手,最近几天我非常努力地研究如何逐行查看 df,并检查 dQ 和 dCQ 列之间有差异的每一行。我只是说 != 0 因为可能有正值或负值。现在,如果这是真的,我想检查另一个 table 是否满足某些条件。我习惯于在 R 中工作,在那里我可以将 df 存储到一个变量中并调用列名,但我似乎无法在 python 中找到一种方法来做到这一点。我发布了我一直在玩的所有代码。我知道这很麻烦,但我们将不胜感激。谢谢! 我试过安装不同的包,但这些包不起作用,我试过制作一个 for 循环(我惨败),也许是一个函数?我什至不知道去哪里看。我从来没有学过 Python,我真的尽我最大的努力在线观看视频并在这里阅读。
import pyodbc
import PyMySQL
import pandas as pd
import numpy as np
conn = pyodbc.connect("Driver={ODBC Driver 17 for SQL Server};"
"Server=***-***-***.****.***.com;"
"Database=****;"
"Trusted_Connection=no;"
"UID=***;"
"PWD=***")
# cur = conn.cursor()
# cur.execute("SELECT TOP 1000 tr.dQ, po.dCQ,
tr.dQ - po.dCQ as diff FROM [IP].[dbo].
[vT] tr (nolock) JOIN [IP].[dbo].[vP] po
ON tr.vchAN = po.vchCustAN WHERE tr.dQ
!= po.dCQ")
# query = cur.fetchall()
query = "SELECT TOP 100 tr.dQ, po.dCQ/*, tr.dQ -
po.dCQ as diff */FROM [IP].[dbo].[vT]
tr (nolock) INNER JOIN [IP].[dbo].[vP] po ON
tr.vchAN = po.vchCustAN WHERE tr.dQ !=
po.dCQ"
df = pd.read_sql(query, conn)
#print(df[2,])
cursor = conn.cursor(PyMySQL.cursors.DictCursor)
cursor.execute("SELECT TOP 100 tr.dQ, po.dCQ/*,
tr.dQ - po.dCQ as diff */FROM [IP].[dbo].
[vT] tr (nolock) INNER JOIN [IP].[dbo].
[vP] po ON tr.vchAN = po.vchCustAN
WHERE tr.dQ != po.dCQ")
result_set = cursor.fetchall()
for row in result_set:
print("%s, %s" % (row["name"], row["category"]))
# if df[3] != 0:
# diff = df[1]-df[2]
# print(diff)
# else:
# exit
# cursor = conn.cursor()
# for row in cursor.fetchall():
# print(row)
#
# for record in df:
# if record[1] != record[2]:
# print(record[3])
# else:
# record[3] = record[1]
# print(record)
# df['diff'] = np.where(df['dQ'] != df["dCQ"])
我希望收到某种通知,指出第 xx 行存在差异,现在它将检查 table vP 以验证我们是否收到了此数据的详细信息。我相信我能做到这一点,如果我能让第一部分工作的话。任何帮助表示赞赏。如果这个问题不清楚,我很抱歉,我会尽力回答别人可能提出的任何问题。谢谢!
一种解决方案是创建一个新列,用于存储 df[1] 和 df[2] 之间的差异结果。先记一个。在制作 df 时命名列可能更精确,然后使用 df['name1'] 和 df['name2'] 引用它们,或者使用 df.iloc[:,1]和 df.iloc[:,2]。另请注意,列号从零开始,因此它们指的是 df 中的第二列和第三列。使用 iloc 的原因是冒号是为了明确声明您想要所有行号和列号 1 和 2。否则,如果您的 df 被转置,则使用 df[1] 或 df[2] 可能实际上指的是您认为是索引。现在,开始解决方案。
你可以试试
df['diff']=df.iloc[:,1]-df.iloc[:,2]
df['diff_bool']=np.where(df['diff']==0,False, True)
或者您可以将其合并为一个方法
df['diff_bool']==np.where(df.iloc[:,1]-df.iloc[:,2]==0,False, True)
这将在您的 df 中创建一个列,说明第一列和第二列之间是否存在差异。你实际上不需要逐行循环,因为 pandas 函数像矩阵数学一样工作,所以 df.iloc[:,1]-df.iloc[:,2] 将应用减法自动逐行。