标签: data-cleaning

个人人口统计信息的模糊数据匹配

假设我有一个数据库,其中包含具有以下数据元素的人员:

  • PersonID(无意义的代理自动编号)
  • 中间初始
  • 名称后缀
  • 出生日期
  • 备用 ID(如 SSN、军人 ID 等)

我从各种格式中获取了大量数据,其中包含您能想到的这些信息的各种合理变化。一些例子是:

  • 全名、出生日期
  • 全名,最后 4 个 SSN
  • 第一个、最后一个、出生日期

当这些数据进来时,我需要写一些东西来匹配它。我不需要或期望获得超过 80% 的匹配率。自动匹配后,我会将不确定的匹配显示在网页上,供某人手动匹配。

其中一些复杂性是:

  1. 有些数据匹配比其他数据匹配更好,我想为这些数据分配权重。例如,如果 SSN 完全匹配,但由于有人使用中间名而导致姓名被关闭,那么我想为该匹配分配比名称完全匹配但 SSN 关闭时更高的置信度值。
  2. 名称匹配有一些困难。John Doe Jr. 与 John Doe II 相同,但与 John Doe Sr. 不同,如果我得到 John Doe 而没有其他信息,我需要确保系统不会选择一个,因为无法确定选择谁。
  3. 名字匹配真的很难。你有鲍勃/罗伯特、约翰/乔恩/乔纳森、汤姆/托马斯等。
  4. 仅仅因为我有一个包含 FullName+DOB 的提要,并不意味着每条记录都会填充 DOB 字段。我不想仅仅因为不匹配的 DOB 破坏了匹配的分数而错过链接。如果缺少某个字段,我想将其从可用于匹配的元素中排除。
  5. 如果有人手动匹配,我希望他们的匹配影响所有未来的匹配。因此,如果我们再次获得相同的精确数据,下次没有理由不自动匹配它。

我已经看到SSIS有模糊匹配,但我们目前不使用SSIS,而且我发现它非常笨拙并且几乎不可能进行版本控制,所以它不是我的首选工具。但如果这是最好的,请告诉我。否则,是否有任何(最好是免费的,最好是基于 .NET 或T-SQL 的)工具/库/实用程序/技术用于解决此类问题?

.net c# algorithm string-matching data-cleaning

5
推荐指数
1
解决办法
3056
查看次数

在Coldfusion 9中清洁字符串/输入

我最近一直在使用Coldfusion 9(主要是PHP的背景),我正试图弄清楚如何'清理/消毒'用户提交的输入/字符串.

我想让它成为HTMLSAFE,消除任何javascript或SQL查询注入,通常.我希望我忽略了CF9已经带来的某种功能.

有人能指出我正确的方向吗?

coldfusion coldfusion-9 data-cleaning

4
推荐指数
2
解决办法
5131
查看次数

如何检测数据库中的异常数据点

我目前有一个数据库,其中有些价格标签错误。

示例数据:

Product - Price - SalesDate
ProdA  - 10  - 1/1/2016
ProdB  - 20  - 1/2/2016
ProdA  - 100 - 1/3/2016
ProdB  - 20  - 1/4/2016
ProdB  - 21  - 1/5/2016
ProdA  - 11  - 1/6/2016
Run Code Online (Sandbox Code Playgroud)

在此数据集中,记录“ProdA - 100 - 1/3/2016”是有错误的记录。输入价格的人很可能犯了打字错误。此外,ProdA 在不同的日子可以改变它的价格,这使得这个问题变得有趣。

什么样的工具可以帮助我识别此类记录?SQL 可以帮助我检测异常数据点吗?我应该为此开始研究机器学习吗?

sql machine-learning sql-server-2008-r2 data-cleaning

4
推荐指数
1
解决办法
5268
查看次数

使用 pandas 将对象类型列转换为数字类型

我正在尝试使用 pandas 清理数据。当我执行 df.datatypes 时,它显示列是对象类型。我希望将它们转换为数字类型。我尝试了各种方法来这样做;

data[['a','b']] = data[['a','b']].apply(pd.to_numeric, errors ='ignore')
Run Code Online (Sandbox Code Playgroud)

然后,

data['c'] = data['c'].infer_objects()
Run Code Online (Sandbox Code Playgroud)

但似乎没有任何效果。解释器不会抛出任何错误,但同时不会执行所需的转换。

任何帮助将不胜感激。

提前致谢。

python pandas data-cleaning

4
推荐指数
1
解决办法
1万
查看次数

计算数字列 Pandas 中的字符串值

我有一个数据框:

    Name    Hours_Worked
1   James   3
2   Sam     2.5
3   Billy   T
4   Sarah   A
5   Felix   5
Run Code Online (Sandbox Code Playgroud)

第一,如何计算具有非数字值的行数?

第二,如何过滤以识别包含非数字值的行?

python-3.x pandas data-cleaning

4
推荐指数
1
解决办法
3478
查看次数

数据清理(地址)Python

我正在寻找清理 61k 行的数据集。我需要清理它的街道地址栏。目前,这些地址是一场噩梦。有时会写出完整地址(即 111 Frederick Douglass Blvd),有时会以简写形式写出相同地址(即 111 8th Ave/111 8th Avenue)。

我是 pandas/python 的新用户,所以我不知道如何解决如此巨大的清洁需求。在我使用 .replace() 之前,但这似乎是完全错误的方法。将不胜感激您的任何见解。

编辑:本质上我正在寻求标准化地址。地址输入不正确或采用多种不同的格式。长期目标是映射所有这些地址,但以数据目前的形式这是不可能的

数据集:https://data.cityofnewyork.us/City-Government/Evictions/6z8x-wfk4

python pandas data-cleaning

4
推荐指数
1
解决办法
7702
查看次数

从噪声字符串中提取电话号码

我在表中有一个列,其中包含随机数据以及不同格式的电话号码。该列可能包含

  • 姓名
  • 电话
  • 电子邮件
  • HTML 标签
  • 地址(带数字)

例子:

1) Call back from +79005346546, Conversation started<br>Phone: +79005346546<br>Called twice Came from google.com<br>IP: 77.106.46.202 the web page address is xxx.com utm_medium: cpc<br>utm_campaign: 32587871<br>utm_content: 5283041 79005346546 
2) John Smith
3) xxx@yyy.com
4) John Smith 8 999 888 77 77
Run Code Online (Sandbox Code Playgroud)

电话号码的写法也取决于。它可能像8 927 410 00 22, 8(927)410-00-22, +7(927)410-00-22, +7 (927) 410-00-22, (927)410 00 22, 927 410 00 22, 9(2741) 0 0 0-22等等

这里的通用规则是电话号码格式包含 10-11 位数字。

我最好的猜测是使用正则表达式并首先从字符串中删除电子邮件地址(因为它们可以包含电话号码,如 79990001122@gmail.com),然后使用一些正则表达式根据知道它是 10 或 11 位数字来提取电话用诸如,(,),+,-等字符分隔的行(我认为不会有人将其. …

regex sql database sql-server data-cleaning

4
推荐指数
1
解决办法
768
查看次数

使用 dplyr mutate 函数替换多个值

在以下数据中,两个变量的水平均以数字编码

dat = read.csv("https://studio.edx.org/c4x/HarvardX/PH525.1x/asset/assoctest.csv")
head(dat)
Run Code Online (Sandbox Code Playgroud)

我将这些代码替换为字符串,以便于阅读和绘图。我可以使用 dplyr mutate 函数成功完成此操作。

dat_char = mutate(dat, allele=replace(allele, allele==0, "AA/Aa")) %>% 
mutate(allele=replace(allele, allele==1, "aa")) %>%
mutate(case=replace(case, case==0, "control")) %>%
mutate(case=replace(case, case==1, "case"))
Run Code Online (Sandbox Code Playgroud)

上面的代码工作得很好,但是它是重复的并且写起来很繁琐。我确信有一种方法可以同时执行其中一些替换并精简代码,但我不确定如何进行。例如,我尝试使用向量作为查找和替换值。

dat_char = mutate(dat, allele=replace(allele, allele==c(0,1), c("AA/Aa", "aa"))) %>%
mutate(case=replace(case, case==c(0,1),  c("control", "case")))
head(dat_char)
Run Code Online (Sandbox Code Playgroud)

这只会让事情变得一团糟,但它让我明白了我想要实现的目标。

replace r dplyr data-cleaning

4
推荐指数
1
解决办法
8424
查看次数

使用 dplyr 的每组前“n”行——每组具有不同的数量

我将使用内置chickwts数据作为示例。

这是数据,有 5 种提要类型。

> head(chickwts)

  weight      feed
1    179 horsebean
2    160 horsebean
3    136 horsebean
4    227 horsebean
5    217 horsebean
6    168 horsebean

> table(chickwts$feed)

   casein horsebean   linseed  meatmeal   soybean sunflower 
       12        10        12        11        14        12 
Run Code Online (Sandbox Code Playgroud)

我想要的是每种饲料类型按重量计算的前几行。但是,对于每种 Feed 类型我都需要不同的编号吗?例如,

top_n_feed <-
  c(
    "casein" = 3,
    "horsebean" = 5,
    "linseed" = 3,
    "meatmeal" = 6,
    "soybean" = 3,
    "sunflower" = 2
  )
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点dplyr

要按n重量获得每种提要类型的顶行,我可以使用如下代码,但我不确定如何将其扩展到每种提要类型的不同数字。

chickwts %>%
  group_by(feed) %>% 
  slice_max(order_by = weight, …
Run Code Online (Sandbox Code Playgroud)

r dplyr data-cleaning data-wrangling

4
推荐指数
1
解决办法
119
查看次数

如何从pandas df中的每一行中创建新列

我有一个很难处理的 NBA 数据数据框。我想将 df1 更改为 df2,让两支球队和他们在同一行的比赛中得分两次,以从两支球队的角度来看比赛结果:

df1

GameID     TeamID     TeamAbb     PTS
   0        1001        TOR        99
   0        1023        ATL        86
   1        1004        DAL        102
   1        1003        POR        100
   2        1015        LAL        96
   2        1029        MIL        85

df2

GameID     Team1ID     Team2ID     Team1Abb      Team2Abb    Team1PTS    Team2PTS
   0        1001        1023         TOR           ATL          99          86
   0        1023        1001         ATL           TOR          86          99
   1        1004        1003         DAL           POR          102         100
   1        1003        1004         POR           DAL          100         102
Run Code Online (Sandbox Code Playgroud)

所以本质上是数据框的一种加宽。

python data-manipulation pandas data-cleaning

4
推荐指数
1
解决办法
50
查看次数