【问题标题】:How to compare two dataframes of the same size and create a new one without the rows that have the same value in a column如何比较两个相同大小的数据框并创建一个新的数据框,而列中没有具有相同值的行
【发布时间】:2019-11-19 20:02:52
【问题描述】:

我正在创建一个数据采集设备,它每 5 分钟检索一次传感器数据(来自 API)并将其保存在 CSV 文件中(每 24 小时导出到数据库),我想通过仅保存来减小这些文件的大小值变化时的数据。

我的想法是将所有数据保存在“内存”CSV 文件中(将在一天结束时删除)并将最后 X 行 (df1 -> T1) 与新数据帧 (df2 - > T2) 并创建数据框 (df3 -> T2) 没有值保持不变的行。此 df3 将写入另一个 CSV,该 CSV 将在一天结束时导出到数据库。

这是正确的方法吗?

如何比较两个相同大小的数据帧并创建第三个数据帧,而没有值不变的行?

df1 
   Time   Name  Value
0   t1  Name1      3
1   t1  Name2      1
2   t1  Name3      5
3   t1  Name4      9 

df2 
   Time   Name  Value
0   t2  Name1      3
1   t2  Name2      7
2   t2  Name3      5
3   t2  Name4      2 

df3 
   Time   Name  Value
0   t2  Name2      7
1   t2  Name4      2

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    DataFrame.merge 与指示器一起使用并仅过滤right_only 行:

    df = (df1.merge(df2, on=['Name','Value'], indicator=True, how='outer', suffixes=('_',''))
            .query('_merge == "right_only"')[df2.columns])
    
    print (df)
      Time   Name  Value
    4   t2  Name2      7
    5   t2  Name4      2
    

    【讨论】:

    • @Erfan - 而不是所有的列,因为Time 是不同的。
    【解决方案2】:

    用途:

    df3 = df2[df2['value'] != df1['value']]
    

    【讨论】:

    • 这项工作是在这个特定示例中名称的顺序相同,但通常您还应该包括Name 列:df2[(df2['Value'] != df1['Value']) & (df2['Name'] == df1['Name'])]
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 2020-02-04
    • 1970-01-01
    • 2020-12-04
    • 1970-01-01
    相关资源
    最近更新 更多