如何从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 

如何或者什么function可以做到这一点?

使用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 

请注意,当您想要进行放置操作时,使用“inplace”命令可能很重要。

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

因为你原来的问题没有返回任何东西,所以应该使用这个命令。 http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html

您也可以传递给DataFrame.drop 标签本身 (而不是索引标签系列):

 In[17]: df Out[17]: abcde 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]: abcde two -1.015127 -0.445133 1.867681 2.179392 0.518801 

这相当于:

 In[19]: df.drop(df.index[[0]]) Out[19]: abcde two -1.015127 -0.445133 1.867681 2.179392 0.518801 

如果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.drop花了5min 27s 20.5s ,并消耗了大量的记忆。 由此产生的DataFrame是相同的。

在对@ 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()是我定义的函数,它经历了索引的元素rename_duplicates()命名了重复项。 我使用了与pd.read_csv()在列上使用相同的重命名模式,即"%s.%d" % (name, count) ,其中name是行的名称, count是以前发生过的次数。