2013-02-02 11 views
155

Pandasデータフレームから行のリストを削除するにはどうすればよいですか?私は、データフレームDFを持って

>>> df 
        sales discount net_sales cogs 
STK_ID RPT_Date          
600141 20060331 2.709  NaN  2.709 2.245 
     20060630 6.590  NaN  6.590 5.291 
     20060930 10.103  NaN  10.103 7.981 
     20061231 15.915  NaN  15.915 12.686 
     20070331 3.196  NaN  3.196 2.710 
     20070630 7.907  NaN  7.907 6.459 

は、その後、私はここに仮定し、リストに示された特定のシーケンス番号を持つ行をドロップしたい[1,2,4],その後、残っている:

    sales discount net_sales cogs 
STK_ID RPT_Date          
600141 20060331 2.709  NaN  2.709 2.245 
     20061231 15.915  NaN  15.915 12.686 
     20070630 7.907  NaN  7.907 6.459 

どうか、どのような機能缶それを行う ?

答えて

232

使用DataFrame.dropとインデックスラベルのシリーズを渡し:あなたが行のドロップをしたいときには、「インプレース」コマンドを使用することが重要であり得ることを

In [65]: df 
Out[65]: 
     one two 
one  1 4 
two  2 3 
three 3 2 
four  4 1 


In [66]: df.drop(df.index[[1,3]]) 
Out[66]: 
     one two 
one  1 4 
three 3 2 
+13

+1最後の行を削除するdf.drop(df.tail(1).index) –

+8

@ NasserAl-Wohaibiこれはdf.ix [: - 1]で行うことができます – megabyde

+7

この回答はdf .index.unique()はdf.indexと同じですが、これはPandas DataFrameの要件ではありません。 df.indexの値が一意であることが保証されていない場合は誰でも解決策がありますか? –

28

またDataFrame.dropに(代わりにインデックスラベルのシリーズの)ラベル自体を渡すことができます。

と同等です
In[17]: df 
Out[17]: 
      a   b   c   d   e 
one 0.456558 -2.536432 0.216279 -1.305855 -0.121635 
two -1.015127 -0.445133 1.867681 2.179392 0.518801 

In[18]: df.drop('one') 
Out[18]: 
      a   b   c   d   e 
two -1.015127 -0.445133 1.867681 2.179392 0.518801 

:@へ

コメントで
In[19]: df.drop(df.index[[0]]) 
Out[19]: 
      a   b   c   d   e 
two -1.015127 -0.445133 1.867681 2.179392 0.518801 
+1

df.drop(df.index [0])も機能します。つまり、ダブルsquare_brackets(パンダ0.18.1、少なくとも)の必要はありません。 – tagoma

1

theodros-zellekeさんの答えは、@ j-jonesがインデックスが一意でない場合にどう対処するか尋ねました。私はそのような状況に対処しなければならなかった。

rename_duplicates()は、インデックスの要素を経て、重複を名前を変更私は定義された関数である
dropped_indexes = <determine-indexes-to-drop> 
df.index = rename_duplicates(df.index) 
df.drop(df.index[dropped_indexes], inplace=True) 

:私がやったことは、私はラ、drop()と呼ばれる前に、インデックス内の重複の名前を変更することでした。私はpd.read_csv()と同じ名前変更パターン、すなわち"%s.%d" % (name, count)を使用しました。ここでnameは行の名前であり、countは以前に何回発生したかです。

22

DataFrameが巨大で、ドロップする行数も大きい場合は、インデックスdf.drop(df.index[])による単純なドロップに時間がかかりすぎます。

私のケースでは、浮動小数点数の複数インデックスのDataFrameを100M rows x 3 colsに持っていて、それから10k行を削除する必要があります。私が見つけた最も速い方法は、まったく逆説的に、残りの行takeです。

indexes_to_dropは、ドロップする位置インデックスの配列(質問では[1, 2, 4])にしてください。私の場合は

indexes_to_keep = set(range(df.shape[0])) - set(indexes_to_drop) 
df_sliced = df.take(list(indexes_to_keep)) 

シンプルdf.drop5min 27sを取り、大量のメモリを消費しながら、これは、20.5sを取りました。結果のDataFrameは同じです。私はのは、インデックスxを言わせている行をドロップしたい場合は、私は次のことを行うだろう

2

df = df[df.index != x] 

私は複数のインデックスをドロップしたい場合(たとえばこれらのインデックスはリストunwanted_indicesです)、私はそうするでしょう:

1

私はこれを簡単な方法で2段階で解決しました。

ステップ1:まず、不要な行/データを含むデータフレームを作成します。

ステップ2:この不要なデータフレームのインデックスを使用して、元のデータフレームから行を削除します。

例:

は、あなたが整数である「年齢」を含む同じ数の列データフレームDFを持っていると仮定します。今度は、「Age」を負の数としてすべての行を削除したいとしましょう。

ステップ1:df_age_negative = DF [] '年齢' [DF < 0]

ステップ2:DF = df.drop(df_age_negative.index、軸= 0)

ホープこれははるかに簡単ですあなたを助けます。

関連する問題