如何从Pandas DataFrame中删除多行?

359 投票
15 回答
780902 浏览
提问于 2025-04-17 14:32

我有一个数据表叫做 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

我该怎么做或者用什么函数可以实现这个呢?

15 个回答

78

如果你的数据表(DataFrame)非常大,而且要删除的行也很多,那么直接通过索引删除,比如用 df.drop(df.index[]),就会花费很多时间。

在我的例子中,我有一个包含 1亿行 x 3列 的浮点数的多重索引数据表,我需要从中删除 1万 行。让我惊讶的是,最快的方法竟然是先“保留”剩下的行。

假设 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.5秒,而简单的 df.drop 方法则花了 5分钟27秒,而且还消耗了很多内存。最终得到的数据表是一样的。

156

请注意,当你想要直接在原来的数据上进行删除操作时,使用“inplace”这个命令可能很重要。

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

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

520

使用 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(index=[1,3])
Out[66]: 
       one  two
one      1    4
three    3    2

撰写回答