如何从Pandas数据帧中删除行列表?

big*_*bug 226 python 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
Run Code Online (Sandbox Code Playgroud)

然后我想删除具有列表中指示的某些序列号的行,假设此处为[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
Run Code Online (Sandbox Code Playgroud)

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

The*_*eke 356

使用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
Run Code Online (Sandbox Code Playgroud)

  • 在示例中,如果您想要清楚,请不要对行和列使用相同的字符串.对那些真正了解自己的东西的人来说,这很好.对那些想要学习的人感到沮丧. (36认同)
  • +1另外,删除最后一行df.drop(df.tail(1).index) (17认同)
  • 这个答案只有在df.index.unique()与df.index相同时才有效,这不是Pandas DataFrame的要求.当df.index值不能保证唯一时,有没有人有解决方案? (13认同)
  • python 新手:请注意,如果您想删除这些行并将它们保存在同一个数据框中(就地),您还需要添加 `axis=0`(0 = 行,1 = 列)和 `inplace=True` 作为在`df.drop(df.index[[1,3]], axis=0, inplace=True)`中。@mezzanaccio,如果您特别知道要替换哪些索引(以及使用 0 到 n 示例):`df.drop(df.index[range(0, n)], axis=0, inplace=True)` (4认同)
  • 这不允许您索引索引名称本身 (2认同)
  • 你怎么能用一系列的行来做到这一点?说从第 0 行到第 n 行。 (2认同)

use*_*053 100

请注意,当您想要执行下拉行时,使用"inplace"命令可能很重要.

df.drop(df.index[[1,3]], inplace=True)
Run Code Online (Sandbox Code Playgroud)

因为您的原始问题没有返回任何内容,所以应该使用此命令. http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.drop.html


dan*_*dar 41

您还可以传递给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
Run Code Online (Sandbox Code Playgroud)

这相当于:

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
Run Code Online (Sandbox Code Playgroud)


Den*_*zov 37

如果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))
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这采取了20.5s,而简单的df.drop采取5min 27s和消耗了大量的内存.生成的DataFrame是相同的.


小智 19

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

步骤1:首先形成包含不需要的行/数据的数据帧.

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

例:

假设您有一个数据帧df,其中包含'Age'这一整数列.现在让我们假设您要删除所有行,其中'Age'为负数.

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

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

希望这更简单,并帮助您.

  • +1,这是唯一告诉您如何删除选择与第一列不同的列的行的答案。 (3认同)
  • 这就是我正在寻找的答案。谢谢克里希那普拉萨德·加鲁 (2认同)

小智 10

如果我想删除一个让我们说索引的行x,我会做以下事情:

df = df[df.index != x]
Run Code Online (Sandbox Code Playgroud)

如果我想删除多个索引(比如这些索引在列表中unwanted_indices),我会这样做:

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]
Run Code Online (Sandbox Code Playgroud)


kam*_*sar 8

仅使用索引参数来删除行:-

df.drop(index = 2, inplace = True)
Run Code Online (Sandbox Code Playgroud)

对于多行:-

df.drop(index=[1,3], inplace = True)
Run Code Online (Sandbox Code Playgroud)


cyb*_*ath 5

我想展示一些具体的例子。假设您在某些行中有很多重复的条目。如果您有字符串条目,则可以轻松地使用字符串方法来查找所有要删除的索引。

ind_drop = df[df['column_of_strings'].apply(lambda x: x.startswith('Keyword'))].index
Run Code Online (Sandbox Code Playgroud)

现在使用它们的索引删除这些行

new_df = df.drop(ind_drop)
Run Code Online (Sandbox Code Playgroud)