我正在使用SAS/SQL背景中的R,我正在尝试编写代码来获取两个表,比较它们,并提供差异列表.此代码将重复用于许多不同的表集,因此我需要避免硬编码.
我正在使用识别R中两个数据集之间的特定差异,但它并没有让我一路走来.
示例数据,使用LastName/FirstName(唯一)的组合作为键 -
Dataset One --
Last_Name First_Name Street_Address ZIP VisitCount
Doe John 1234 Main St 12345 20
Doe Jane 4321 Tower St 54321 10
Don Bob 771 North Ave 23232 5
Smith Mike 732 South Blvd. 77777 3
Dataset Two --
Last_Name First_Name Street_Address ZIP VisitCount
Doe John 1234 Main St 12345 20
Doe Jane 4111 Tower St 32132 17
Donn Bob 771 North Ave 11111 5
Desired Output --
LastName FirstName VarName TableOne TableTwo
Doe …Run Code Online (Sandbox Code Playgroud) 我有两个表,我想以一种等同于以下SQL的方式连接在一起,在这里我加入多个条件,而不仅仅是相等.
require(sqldf)
require(data.table)
dt <- data.table(num=c(1, 2, 3, 4, 5, 6),
char=c('A', 'A', 'A', 'B', 'B', 'B'),
bool=c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE))
dt_two <- data.table(
num =c(6, 1, 5, 2, 4, 3),
char=c('A', 'A', 'A', 'B', 'B', 'B'),
bool=c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE))
dt_out_sql <- sqldf('
select dtone.num, dtone.char, dtone.bool, SUM(dttwo.num) as SUM,
MIN(dttwo.num) as MIN
from dt as dtone INNER join dt_two as dttwo on
(dtone.char = dttwo.char) and
(dtone.num >= dttwo.num OR dtone.bool)
GROUP BY dtone.num, …Run Code Online (Sandbox Code Playgroud) 我在 Python 中有一组记录,其中包含一个 id、至少一个属性和一组日期范围。我想要采用每个 id 的代码,并组合属性匹配且日期范围内没有间隙的所有记录。
日期范围没有间隔,我的意思是一个记录的结束日期大于或等于该 ID 的下一个记录。
例如,ID 为“10”、开始日期为“2016-01-01”和结束日期为“2017-01-01”的记录可以与具有该 ID、开始日期为“2017-01-01”的另一条记录合并”,结束日期为“2018-01-01”,但它不能与从“2017-01-10”开始的记录合并,因为从 2017-01-01 到 2017 会有一个间隔-01-09。
这里有些例子 -
有:
FruitID,FruitType,StartDate,EndDate
1,Apple,2015-01-01,2016-01-01
1,Apple,2016-01-01,2017-01-01
1,Apple,2017-01-01,2018-01-01
2,Orange,2015-01-01,2016-01-01
2,Orange,2016-05-31,2017-01-01
2,Orange,2017-01-01,2018-01-01
3,Banana,2015-01-01,2016-01-01
3,Banana,2016-01-01,2017-01-01
3,Blueberry,2017-01-01,2018-01-01
4,Mango,2015-01-01,2016-01-01
4,Kiwi,2016-09-15,2017-01-01
4,Mango,2017-01-01,2018-01-01
Run Code Online (Sandbox Code Playgroud)
想:
FruitID,FruitType,NewStartDate,NewEndDate
1,Apple,2015-01-01,2018-01-01
2,Orange,2015-01-01,2016-01-01
2,Orange,2016-05-31,2018-01-01
3,Banana,2015-01-01,2017-01-01
3,Blueberry,2017-01-01,2018-01-01
4,Mango,2015-01-01,2016-01-01
4,Kiwi,2016-09-15,2017-01-01
4,Mango,2017-01-01,2018-01-01
Run Code Online (Sandbox Code Playgroud)
我目前的解决方案如下。它提供了我正在寻找的结果,但对于大型数据集,性能似乎并不好。此外,我的印象是您通常希望尽可能避免迭代数据帧的各个行。非常感谢您提供的任何帮助!
import pandas as pd
from dateutil.parser import parse
have = pd.DataFrame.from_items([('FruitID', [1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]),
('FruitType', ['Apple', 'Apple', 'Apple', 'Orange', 'Orange', 'Orange', 'Banana', 'Banana', 'Blueberry', 'Mango', 'Kiwi', 'Mango']),
('StartDate', …Run Code Online (Sandbox Code Playgroud)