我有一个数据帧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)
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)
希望这更简单,并帮助您.
小智 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)
仅使用索引参数来删除行:-
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)
我想展示一些具体的例子。假设您在某些行中有很多重复的条目。如果您有字符串条目,则可以轻松地使用字符串方法来查找所有要删除的索引。
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)
归档时间: |
|
查看次数: |
450826 次 |
最近记录: |