我有一个问题,我正在从API中提取数据集以进行报告,但不幸的是,它具有:
没有唯一的标识符字段
组成唯一组合键的四个字段中的三个都是32位哈希值。
它们不应该是哈希值,但是由于某些原因,开发人员似乎已在此特定的API端点中对其进行了哈希处理。
我正在使用Python 3.7.6和pandas 1.0.3。数据最终将最终存储在SQL Server中。
对于我的任务,要求我确保在调用REST API时可以检查记录的唯一性,并且如果数据库中的现有记录已有更新,请使用唯一的标识符来了解要更新的行。
32位哈希值导致出现以下问题:
当串联形成有效组合键的3个哈希字段(和一个datetime字段)时,结果字符串太长而无法用作数据库主键。
该长度似乎正在重载Pandas .duplicates()函数(例如,请参见下文)
我不知道一种将它们“散列”为唯一标识符(例如整数)的方法,我可以将其用于检查数据库中可能需要更新的现有记录。如何将这个long值转换为有效的唯一标识符,该标识符对于任何完全相同的字符串哈希值都相同?
Pandas包含了pd.Factorize,它在理论上可以用于在新提取的数据中创建唯一的标识符,但是它与数据库中已经存在的先前提取的数据不一致,因为它将为相同的哈希生成不同的密钥。此外,类似于#2的分解,在给定字符串长度的情况下,也无法正确工作(请参见下文)。
我真的很感谢上述任何建议。
请找到上面#2的示例,其中pandas .duplicates()失败。我将熊猫中的四个复合键哈希字符串连接如下:
df ['id'] =(df ['问题ID']。astype(str)+ df ['WorkflowInstance ID']。astype('str')+ df ['Agent ID']。astype('str') + df ['评估开始日期'] .astype('str'))。sort_values()
然后执行:
df ['id']。duplicated()。sum()
我得到19个副本:
出[252]:19
这些是“重复项”(请注意:我已从输出中删除了数据框行号):
出[264]:
100094146736011ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00
101580231257511ea533b-5eb8-8bb1-a514-0242ac11000211e9e0ef-5ec7-3570-9724-0242ac1100052020-02-20 04:15:04 + 11:00
102935022988411ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00
103643806614811ea5122-ee46-6471-a514-0242ac11000211e9e0ef-62d2-f9b0-9724-0242ac1100052020-02-17 12:15:05 + 11:00
104448956250611ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00
104448956250611ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00
105036638204211ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00
105439525877511ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00
105439525877511ea3cba-ec08-1e01-b4fb-0242ac11000511e9e0ef-6156-6bd0-9724-0242ac1100052020-01-22 13:00:11 + 11:00
105753070464411ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00
105753070464411ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac11000520202020-03-03 11:00:05 + 11:00
105929086494811ea2dbb-ff69-f5d1-8fa5-0242ac11000311e9e0ef-60e7-a470-9724-0242ac1100052020-01-03 11:00:05 + 11:00
105942530227011ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00
106416598476711ea533b-5eb8-8bb1-a514-0242ac11000211e9e0ef-5ec7-3570-9724-0242ac1100052020-02-20 04:15:04 + 11:00
107187437764311ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00
108645054061411ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00
108669477403111ea1d09-3888-4fb1-ad55-0242ac11000411e9e0ef-6156-6bd0-9724-0242ac1100052019-12-13 05:00:03 + 11:00
108669477403111ea3cba-ec08-1e01-b4fb-0242ac11000511e9e0ef-6156-6bd0-9724-0242ac1100052020-01-22 13:00:11 + 11:00
108783533783711ea6ebc-2980-1bb1-be7d-0242ac11000311e9e0ef-5a8e-e2f0-a8b3-0242ac1100032020-03-26 04:15:01 + 11:00
它们似乎不是重复的。考虑到它们是字符串,我会以为它们不会出现浮点数或舍入错误?
然而!如果我冲洗并重复,我将得到0次重复(应该是这样):
df ['id'] [df ['id']。duplicated()]。sort_values()。duplicated()。sum()
出[257]:0
是什么导致这种奇怪的行为?
这个解决方法至少可以让我确定记录中的唯一性,但是它不能解决上述其他问题。
这是我经过3-4年的大学和工作编程(尽管我还有很多东西要学习)之后的第一个堆栈溢出问题,所以请对我轻松一点。
谢谢