2017-06-14 22 views
2

我有一个两列数据框的日期和引擎如下。我需要一个查询来告诉熊猫:按日期查找重复项目

"Is there any repeated engineID withing the time period 2016-01-01 to 2016-06-30 ?"

engineID Date 
1133  2016-01-24 
1133  2016-02-20 
1132  2016-03-11 
1643  2016-02-07 
1165  2016-02-24 
1724  2016-01-12 
1133  2016-11-23 

所以这里的最后一行不应该被包括在答辩。

最终的答案:

engineID Date 
1133  2016-01-24 
1133  2016-02-20 

回答

5

pandas
使用betweenduplicatedkeep=False
这个答案以避免创建新的索引,并在此过程中覆盖旧的一个只需使用布尔索引与两个布尔数组的开销。第一个确定Date列中的日期是否为必需日期between。第二个决定是否有重复。

df[df.Date.between('2016-01-01', '2016-06-30') & df.engineID.duplicated(keep=False)] 

    engineID  Date 
0  1133 2016-01-24 
1  1133 2016-02-20 

numpy
pd.factorizenp.bincount
在这个答案我创建两个布尔数组来代替between功能。我使用pd.factorizenp.bincout来确定重复项是什么。

d = df.Date.values 
s, e = pd.to_datetime(['2016-01-01', '2016-06-30']).values 
f, u = pd.factorize(df.engineID.values) 
m = np.bincount(f)[f] > 1 
df[(s <= d) & (d <= e) & m] 

    engineID  Date 
0  1133 2016-01-24 
1  1133 2016-02-20 

定时

%timeit df[df.Date.between('2016-01-01', '2016-06-30') & df.engineID.duplicated(keep=False)] 
1000 loops, best of 3: 1.12 ms per loop 

%%timeit 
d = df.Date.values 
s, e = pd.to_datetime(['2016-01-01', '2016-06-30']).values 
f, u = pd.factorize(df.engineID.values) 
m = np.bincount(f)[f] > 1 
df[(s <= d) & (d <= e) & m] 
1000 loops, best of 3: 398 µs per loop 

%%timeit 
d1 = df.set_index('Date').loc['2016-01-01':'2016-06-30'] 
d1[d1.duplicated(['engineID'], keep=False)].reset_index() 
100 loops, best of 3: 1.99 ms per loop 
4

设置日期为指标,那么你可以使用Partial String Indexingduplicated

df = df.set_index('Date') 
df_out = df.loc['2016-01-01':'2016-06-30'] 
df_out[df_out.duplicated(['engineID'],keep=False)].reset_index() 

输出:

 Date engineID 
0 2016-01-24  1133 
1 2016-02-20  1133 
+0

'df.set_index'应该使用选项'就地= TRUE'或分配给另一个变量 –

+0

你是正确的。我错过了那次感谢修正。 –