325

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

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

4

14 に答える 14

477

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
于 2013-02-02T12:11:11.497 に答える
144

ドロップインラインを実行したい場合は、「inplace」コマンドを使用することが重要になる場合があることに注意してください。

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

元の質問では何も返されないため、このコマンドを使用する必要があります。 http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html

于 2016-01-05T14:28:26.223 に答える
48

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
于 2016-05-08T08:28:42.613 に答える
11

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

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

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

new_df = df.drop(ind_drop)
于 2019-01-10T05:50:47.820 に答える
4

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

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

複数行の場合:-

df.drop(index=[1,3], inplace = True)
于 2019-10-14T05:44:13.967 に答える
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)

whererename_duplicates()は、インデックスの要素を調べて重複の名前を変更する、私が定義した関数です。列での使用と同じ名前変更パターンをpd.read_csv()使用しました。つまり、"%s.%d" % (name, count)は行nameの名前で、 はcount以前に発生した回数です。

于 2016-12-22T20:41:54.270 に答える
3

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

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)

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

于 2019-04-17T05:42:10.257 に答える