我有一个包含两列日期和引擎的数据框,如下所示。我需要一个查询来告诉你
“在2016-01-01到2016-06-30这个时间段内是否有重复的engineID?”
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
最佳答案
Pandas
使用 between
和 duplicated
与 keep=False
这个答案避免了创建新索引的开销,并且在这个过程中通过简单地使用带有两个 bool 数组的 bool 索引来覆盖旧索引。第一个确定 Date
列中的日期是否介于
所需日期之间。第二个确定是否有重复项。
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.factorize
和 np.bincount
在这个答案中,我创建了两个 bool 数组来替换 between
功能。我使用 pd.factorize
和 np.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
关于python - Pandas :按日期查找重复项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44534911/