【问题标题】:Compare two tables in Python and return rows that have changed比较 Python 中的两个表并返回已更改的行
【发布时间】:2019-07-31 16:21:38
【问题描述】:

我有两张每天生成的数据非常相似的表(相似但不相同的数据)。

样品表 RT20190101

Time    Sensor  Name    StaTus  Reading Temp    Grade   Acidity
20190101-830,   A345CRT,    XXXXXXX,    Active, 5.6,    54, 8,  3.2
20190101-930,   A445ADE,    XXXXXXX,    Active, 5.5,    54, 8,  1.2
20190101-1030,  D546RTE,    XXXXXXX,    Active, 5.5,    55, 8,  2
20190101-1130,  D678FRT,    XXXXXXX,    De-Active,  5.7,    57, 7,  3.5

样品表 RT20190102

Time    Sensor  Name    StaTus  Reading Temp    Grade   Acidity
20190102-830,   A345CRT,    XXXXXXX,    Active, 5.6,    54, 8,  3.2
20190102-930,   A445ADE,    XXXXXXX,    De-Active,  5.6,    56, 7,  1.2
20190102-1030,  D546RTE,    XXXXXXX,    De-Active,  5.5,    56, 8,  2
20190102-1130,  D678FRT,    XXXXXXX,    Active, 5.5,    56, 9,  2

我想比较两个文件上的传感器并标记它们,其中 TEMP、Grade 和 Acidity 发生了变化。

我可以使用 SQL 解决这个问题,但想在 Python 中复制以下代码

SELECT *
FROM (SELECT A.Time, B.Time, B.Sensor, B.Name, A.Status, B.Status, 
            IIf(A.Status<>B.Status,1,0) AS StatusChange, A.[Reading], B.[Reading], 
            IIf([A.Reading]<>[B.Reading],1,0) AS [Reading Change], 
            iif(A.Temp<>B.Temp,1,iif([A.Grade]<>[B.Grade],1,iif([A.Acidity]<>[B.Acidity],1,0))) AS Change 
    FROM RT20190101 AS A INNER 
    JOIN RT20190102 AS B ON A.Time = B.Time)
WHERE Change=1;

样本输出

A.Time  B.Time  Sensor  Name    A.Status    B.Status    StatusChange    A.Reading   B.Reading   Reading Change
20190101-1130,  20190102-1130,  D678FRT,    XXXXXXX,    De-Active,  Active, 1,  5.7,    5.5,    1

我想获取所有传感器的列表、它们的名称、它们的状态是否改变以及读数是否改变。仅当TEMPGRADEACIDITY 级别也发生变化时。

【问题讨论】:

  • 您能否发布示例输入数据和预期输出?
  • 你在用熊猫吗?
  • 输入和预期输出真的很有帮助。还有任何代码尝试表明您已经尝试过。
  • 用示例数据更新了我的问题
  • 您能否将您的示例数据和输出粘贴到问题中,因为链接不会永远存在,我们也无法将您的数据复制并粘贴到我们的代码中来帮助您解决这个问题

标签: python pandas compare


【解决方案1】:

只是一个大概的想法:

import pandas as pd
import numpy as np
df1 = pd.read_sql_table('first_table', 'postgres:///db_name')
df2 = pd.read_sql_table('second_table', 'postgres:///db_name')

df1['compare'] = np.nan
for i in range(0, len(df1)):
      id = df1['id'].loc[i]
      sensor1 = df1['sensor'].loc[i]
      sensor2 = df2['sensor'].loc[df2['id'] == id]
      if sensor1 != sensor2:
          df1['compare'].loc[i] = False
      else:
          df1['compare'].loc[i] = True

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 2021-07-26
    • 2012-05-09
    • 2021-04-28
    • 2014-02-26
    相关资源
    最近更新 更多