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

什么函数可以做到这一点?


当前回答

如上所述,从布尔值中确定索引。

df[df['column'].isin(values)].index

是否比使用此方法确定索引更占用内存

pd.Index(np.where(df['column'].isin(values))[0])

像这样应用

df.drop(pd.Index(np.where(df['column'].isin(values))[0]), inplace = True)

这种方法在处理大数据帧和有限内存时非常有用。

其他回答

如果DataFrame很大,并且要删除的行数也很大,那么通过索引df.drop(df.index[])简单地删除会花费太多时间。

在我的情况下,我有一个多索引的DataFrame的浮动100M行x 3 cols,我需要从它删除10k行。我发现的最快的方法是,完全违反直觉的,取剩下的行。

设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。掉落花了5分钟27秒,消耗了大量内存。结果的数据帧是相同的。

我用了一个更简单的方法——只用了两步。

用不需要的行/数据创建一个数据框架。 使用这个不需要的数据帧的索引来删除原始数据帧中的行。

例子: 假设你有一个数据框架df,它有很多列,包括'Age',它是一个整数。现在让我们假设你想删除所有以'Age'为负数的行。

df_age_negative = df[ df['Age'] < 0 ] # Step 1
df = df.drop(df_age_negative.index, axis=0) # Step 2

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

这对我很有效

# Create a list containing the index numbers you want to remove
index_list = list(range(42766, 42798))
df.drop(df.index[index_list], inplace =True)
df.shape

这将删除所创建范围内的所有索引

请看下面的数据框架df

df

   column1  column2  column3
0        1       11       21
1        2       12       22
2        3       13       23
3        4       14       24
4        5       15       25
5        6       16       26
6        7       17       27
7        8       18       28
8        9       19       29
9       10       20       30

删除第1列中所有奇数的行

创建一个列n1中所有元素的列表,并只保留那些偶数元素(您不想删除的元素)

Keep_elements = [x for x in df.]列1如果x%2==0]

所有列n1中值为[2,4,6,8,10]的行将被保留或不被删除。

df.set_index('column1',inplace = True)
df.drop(df.index.difference(keep_elements),axis=0,inplace=True)
df.reset_index(inplace=True)

我们将columnn1作为索引,并删除所有不需要的行。然后我们将索引重置回来。 df

   column1  column2  column3
0        2       12       22
1        4       14       24
2        6       16       26
3        8       18       28
4       10       20       30

如果我想删除一个索引为x的行,我将执行以下操作:

df = df[df.index != x]

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

desired_indices = [i for i in len(df.index) if i not in unwanted_indices]
desired_df = df.iloc[desired_indices]