我有一个数据框架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
什么函数可以做到这一点?
如果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
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
正如Dennis Golomazov的回答所建议的,使用逐行删除。您可以选择保留行。假设您有一个要删除的行索引列表,名为indices_to_drop。您可以将其转换为掩码,操作如下:
mask = np.ones(len(df), bool)
mask[indices_to_drop] = False
你可以直接使用这个索引:
df_new = df.iloc[mask]
这个方法的好处是,掩码可以来自任何来源:它可以是一个包含许多列的条件,也可以是其他条件。
真正好的事情是,你根本不需要原始DataFrame的索引,所以索引是否唯一并不重要。
缺点当然是不能用这种方法进行就地放置。