2016-05-18 7 views
1

大きなデータフレームで作業しています。特定の日付を削除する効率的な方法を見つけるのに苦労しています。私がの測定値を特定の日付のから削除しようとしていることに注意してください。パンダのデータフレームから特定の日付を削除する最速の方法

df.ix['2016-04-22'] 

をし、その日からすべての行を引く:

パンダは、あなたが呼び出すことができ、この偉大な機能を有しています。しかし、すべての行を'2016-04-22 'から削除したい場合はどうすればよいですか?

私はこのような機能をしたい:私は日付のリストを排除したい場合は、何も

​​3210

(しかし、それは動作しません)

は今、私は以下のソリューションいます

import numpy as np 
import pandas as pd 
from numpy import random 

###Create a sample data frame 

dates = [pd.Timestamp('2016-04-25 06:48:33'), pd.Timestamp('2016-04-27 15:33:23'), pd.Timestamp('2016-04-23 11:23:41'), pd.Timestamp('2016-04-28 12:08:20'), pd.Timestamp('2016-04-21 15:03:49'), pd.Timestamp('2016-04-23 08:13:42'), pd.Timestamp('2016-04-27 21:18:22'), pd.Timestamp('2016-04-27 18:08:23'), pd.Timestamp('2016-04-27 20:48:22'), pd.Timestamp('2016-04-23 14:08:41'), pd.Timestamp('2016-04-27 02:53:26'), pd.Timestamp('2016-04-25 21:48:31'), pd.Timestamp('2016-04-22 12:13:47'), pd.Timestamp('2016-04-27 01:58:26'), pd.Timestamp('2016-04-24 11:48:37'), pd.Timestamp('2016-04-22 08:38:46'), pd.Timestamp('2016-04-26 13:58:28'), pd.Timestamp('2016-04-24 15:23:36'), pd.Timestamp('2016-04-22 07:53:46'), pd.Timestamp('2016-04-27 23:13:22')] 

values = random.normal(20, 20, 20) 

df = pd.DataFrame(index=dates, data=values, columns ['values']).sort_index() 

### This is the list of dates I want to remove 

removelist = ['2016-04-22', '2016-04-24'] 

このループのためには、基本的に私が削除したい日付のインデックスをつかむ、メインデータフレームのインデックスからそれを排除し、積極的に選択し、残りの日付(すなわち、良い日付)をデータフレームから削除します。

for r in removelist: 
    elimlist = df.ix[r].index.tolist() 
    ind = df.index.tolist() 
    culind = [i for i in ind if i not in elimlist] 
    df = df.ix[culind] 

もっと良い点はありますか?

は、私はまた、丸みを帯びた日付+ 1日でインデックス作成を試してみたので、このような何か:

df[~((df['Timestamp'] < r+pd.Timedelta("1 day")) & (df['Timestamp'] > r))] 

しかし、これは本当に厄介取得します(一日の終わりに)私はまだ使用しています特定のn日を削除する必要があるときのforループ。

もっと良い方法があるはずです。右?多分?

答えて

1

同じ@Alexanderなどのアイデアが、DatetimeIndexnumpy.in1dの特性を使用して:

mask = ~np.in1d(df.index.date, pd.to_datetime(removelist).date) 
df = df.loc[mask, :] 

タイミング:あなたの簡潔な応答のための

%timeit df.loc[~np.in1d(df.index.date, pd.to_datetime(removelist).date), :] 
1000 loops, best of 3: 1.42 ms per loop 

%timeit df[[d.date() not in pd.to_datetime(removelist) for d in df.index]] 
100 loops, best of 3: 3.25 ms per loop 
+0

恐ろしい!完璧に動作します!あなたのお返事ありがとうございます! – Reid

-1

おそらく参考

df = df.drop(pd.to_datetime('2016-04-22')) 

これは明示的に検出し、pd.to_datetime('2016-04-22')と等しいインデックスを持つ行を削除し、残りを返します。より多くを削除したい場合は、iterableを渡すことができます。 を使用しました。dropは、datetimeのように見えてixのように見える場合、自動的にdatetimeに変換されないためです。

この提案の問題は、渡されたiterableの要素がインデックスにない場合、それが失敗することです。回避策はありますが、その時点で@ Alexanderと@ rootの答えはよりエレガントです。

+0

感謝を!あまりにもたくさん。 :) しかし、pd.to_datetime( '2016-04-22')は[Timestamp( '2016-04-22 00:00:00')]に変換されるため、この特定の解決策は役に立ちません。私のデータセットにはありません。 – Reid

+0

あなたが与えた例から作業していました。これは 'df.ix [〜 '2016-04-22']'でした。 'df.drop(pd.to_datetime( '2016-04-22'))'はあなたが意図したものと同等です。 'drop'は変換を行わないので' pd.to_datetime'が必要です。私はあなたが自分の目的に合わせてそれを修正できると思っていました。いずれにしても、アレクサンダーにはいつものように素晴らしい解決策があります:-) – piRSquared

+0

あなたのお返事ありがとうございます!私は非常に具体的なものを求めています。それは元の投稿にはなかったかもしれません。 – Reid

3

リストの理解を使用してブール値マスクを作成できます。

>>> df[[d.date() not in pd.to_datetime(removelist) for d in df.index]] 
         values 
2016-04-21 15:03:49 28.059520 
2016-04-23 08:13:42 -22.376577 
2016-04-23 11:23:41 40.350252 
2016-04-23 14:08:41 14.557856 
2016-04-25 06:48:33 -0.271976 
2016-04-25 21:48:31 20.156240 
2016-04-26 13:58:28 -3.225795 
2016-04-27 01:58:26 51.991293 
2016-04-27 02:53:26 -0.867753 
2016-04-27 15:33:23 31.585201 
2016-04-27 18:08:23 11.639641 
2016-04-27 20:48:22 42.968156 
2016-04-27 21:18:22 27.335995 
2016-04-27 23:13:22 13.120088 
2016-04-28 12:08:20 53.730511 
+0

偉大な選択肢!ありがとうアレクサンダー! – Reid

関連する問題