パンダのデータフレームから行のリストをドロップする方法は?


258

私はデータフレーム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

どのように、またはどのような機能でそれを行うことができますか?


明確にするために、この質問は特定のインデックス値を持つ行の削除に関するものです。[1,2,4]の使用は、削除後に残った行を指すことです。これを行う答えは以下のとおりです。
錬金術

回答:


386

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

18
+1さらに、最後の行の削除df.drop(df.tail(1).index)
Nasser Al-Wohaibi 2014

15
この回答は、df.index.unique()がdf.indexと同じである場合にのみ機能します。これは、Pandas DataFrameの要件ではありません。df.index値が一意であることが保証されていない場合、誰かが解決策を持っていますか?
Jジョーンズ

2
これは、インデックス名自体にインデックスを付けることを許可しません
ingrid

45
例では、明確にしたい場合は、行と列に同じ文字列を使用しないでください。すでに自分のことを本当に知っている人にとっては、それで十分です。学ぼうとしている人にとってイライラします。
gseattle 2017年

2
pythonへの新規参入者:あなたはこれらの行を削除し、同じデータフレーム(インプレース)に保存したい場合にも追加する必要があることに注意してくださいaxis=0(0 =行、1 =列)とinplace=Trueのようにdf.drop(df.index[[1,3]], axis=0, inplace=True)。@mezzanaccio、置き換えるインデックスを具体的に知っている場合(および0からnの例も使用):df.drop(df.index[range(0, n)], axis=0, inplace=True)
mrbTT


47

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))

私の場合、これには時間がかかりましたが20.5s、単純なものdf.drop5min 27s多くのメモリを消費しました。結果のDataFrameは同じです。


43

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

23

私はこれをより簡単な方法で解決しました-わずか2ステップで。

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

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

例:

整数である 'Age'を含む列と同じ数のデータフレームdfがあるとします。ここで、「年齢」を負の数としてすべての行を削除するとします。

ステップ1:df_age_negative = df [df ['Age'] <0]

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

これがはるかに簡単で、あなたを助けることを願っています。


1
+1、これは最初のものとは異なる列を選択する行を削除する方法を説明する唯一の答えです。
Alejo Bernardin

10

index xなどの行を削除する場合は、次のようにします。

df = df[df.index != x]

複数のインデックスを削除する場合(これらのインデックスがリストunwanted_indicesにあるとしましょう)、次のようにします。

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]

6

ここに少し具体的な例を示します。一部の行に多くの重複するエントリがあるとします。文字列エントリがある場合は、文字列メソッドを使用して、削除するすべてのインデックスを簡単に見つけることができます。

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index

そして今、それらの行をインデックスを使用して削除します

new_df = df.drop(ind_drop)

3

@ theodros-zellekeの回答へのコメントで、@ j-jonesはインデックスが一意でない場合の対処方法を尋ねました。私はそのような状況に対処しなければなりませんでした。私がやったことは、私が呼び出す前に、インデックス内の重複の名前を変更することでしたdrop()

dropped_indexes = <determine-indexes-to-drop>
df.index = rename_duplicates(df.index)
df.drop(df.index[dropped_indexes], inplace=True)

ここrename_duplicates()で、indexの要素を調べて重複の名前を変更した関数を定義しました。私は、同じ名前の変更パターンを使用しpd.read_csv()、カラム、すなわち上の用途"%s.%d" % (name, count)、どこnameの行の名前であり、countそれは以前に発生した回数です。


1

上記のようにブールからインデックスを決定する

df[df['column'].isin(values)].index

この方法を使用してインデックスを決定するよりもメモリを集中的に使用できます

pd.Index(np.where(df['column'].isin(values))[0])

そのように適用された

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

この方法は、大きなデータフレームと限られたメモリを処理するときに役立ちます。


0

行を削除するには、インデックス引数のみを使用します:-

df.drop(index = 2, inplace = True)

複数行の場合:-

df.drop(index=[1,3], inplace = True)

0

データフレームの例を考えてみましょう

df =     
index    column1
0           00
1           10
2           20
3           30

2番目と3番目のインデックス行を削除します。

アプローチ1:

df = df.drop(df.index[2,3])
 or 
df.drop(df.index[2,3],inplace=True)
print(df)

df =     
index    column1
0           00
3           30

 #This approach removes the rows as we wanted but the index remains unordered

アプローチ2

df.drop(df.index[2,3],inplace=True,ignore_index=True)
print(df)
df =     
index    column1
0           00
1           30
#This approach removes the rows as we wanted and resets the index. 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.