如何从Pandas DataFrame中删除多行?
我有一个数据表叫做 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