pandas
使用between
和duplicated
与keep=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.factorize
和np.bincount
在这个答案我创建两个布尔数组来代替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
'df.set_index'应该使用选项'就地= TRUE'或分配给另一个变量 –
你是正确的。我错过了那次感谢修正。 –