python - Pandas :按日期查找重复项目

标签 python pandas numpy

我有一个包含两列日期和引擎的数据框,如下所示。我需要一个查询来告诉你

“在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
使用 betweenduplicatedkeep=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.factorizenp.bincount
在这个答案中,我创建了两个 bool 数组来替换 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

关于python - Pandas :按日期查找重复项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44534911/

相关文章:

Python Pandas 根据多种条件(长度和内容)将字符串从一个单元格复制到另一个单元格

python - statsmodels 无法使用诸如登录异构类型行之类的函数来预测公式

python - 什么是矢量化?

python - 循环中嵌套字典

python - 矩形不会显示在 wxpython 上

python - 将列表分成行(从列表创建嵌套列表)

python - 如何提取包含文本的 pandas 系列的每一行中的特定数字

python - python pandas 中列的数组范围

python - numpy:沿新轴扩展数组?

python - 在 scikit learn 中设置字数上限