[python] 如何从Pandas数据框中删除行列表?


Answers

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

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

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

Question

我有一个数据框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

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




我以一种更简单的方式解决了这个问题 - 只需2步。

步骤1:首先用不需要的行/数据形成一个数据帧。

第2步:使用此不需要的数据帧的索引删除原始数据帧中的行。

例:

假设你有一个数据框df,其中包括'Age'这个整数。 现在让我们假设你想把所有的'Age'行作为负数。

第1步:df_age_negative = df [df ['Age'] <0]

第2步:df = df.drop(df_age_negative.index,axis = 0)

希望这更简单,并帮助你。




如果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是相同的。




Links