Python 熊猫:按日期查找重复的项目

Python 熊猫:按日期查找重复的项目,python,pandas,numpy,Python,Pandas,Numpy,我有一个由两列组成的数据框架,日期和引擎如下。我需要一个问题告诉你 “在2016-01-01至2016-06-30期间是否有重复的发动机ID?” 所以这里最后一行不应该包括在答案中 最后答覆: engineID Date 1133 2016-01-24 1133 2016-02-20 将日期设置为索引,然后可以使用和复制日期: df = df.set_index('Date') df_out = df.loc['2016-01-01':'2016-06-30'

我有一个由两列组成的数据框架,日期和引擎如下。我需要一个问题告诉你

“在2016-01-01至2016-06-30期间是否有重复的发动机ID?”

所以这里最后一行不应该包括在答案中

最后答覆:

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

将日期设置为索引,然后可以使用和复制日期:

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

熊猫

在和复制之间使用
,并将
保持为False

这个答案避免了创建新索引的开销,并通过简单地使用带有两个布尔数组的布尔索引来覆盖旧索引。第一个参数确定
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

在这个答案中,我创建了两个布尔数组来替换
之间的
功能。我使用
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
d=df.Date.values
s、 e=pd.至_日期时间(['2016-01-01','2016-06-30'])值
f、 u=pd.factorize(df.engineID.values)
m=np.bincount(f)[f]>1

df[(s
df.set\u index
应使用选项
inplace=True
或分配给另一个变量您是正确的。我错过了,谢谢您的更正。
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