pandas
keep=False
とbetween
とduplicated
を使用して、この答えは、新しいインデックスを作成し、その過程で、単純に2つのブール配列でブールインデックスを使用して、古いものを上書きするオーバーヘッドを回避できます。最初に、Date
列の日付がbetween
であるかどうかが判断されます。 2番目は、重複があるかどうかを判断します。この回答で
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
機能を置き換えるために、2つのブール配列を作成します。私は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'をを使用するか、あなたが正しい別の変数 –
に割り当てる必要があります。私は訂正のためにそれを逃した。 –