2016-04-28 47 views
1

我想通过使用多个布尔选择标准从数据框中删除某些行。下面是我的测试数据框:使用多个标准选择行

import pandas as pd 

df = pd.DataFrame({'a':range(0,10,2), 'b':range(0,1000,200)}) 
df['c'] = 10*df.b 
df 

enter image description here

我能选择我想删除,使用这些单独的命令行:

df1 = df.ix[df.c>5000] 
df2 = df1.ix[df1.b<800] 
df2 

离开我DF2包括单行:

enter image description here

我很想能够选择使用一个行的行可能是这个样子:

df2 = (df.ix[df.c>5000]) & (df.ix[df1.b<800]) 
df2 

,但不起作用。最后,我当然想把它变成一个删除命令。

回答

1

为了做出选择,根据你试图在你的描述,申请条件,请尝试使用布尔索引这样的:

>> condition = (df.c > 5000) & (df.b < 800) 
>> df2 = df[condition] 

,为了删除,使用相同的条件下,你能做到这样的:

>> df.drop(df[condition].index.tolist()) 

这将返回一个pd.core.frame.DataFrame,你会想在这里分配或使用inplace标志是这样的:

>> df.drop(df[condition].index.tolist(), inplace=True) 

我希望这有助于!

+0

伟大的前半部分答案 - 选择作品在单线!但你的答案的第二点取决于人工干预(首先知道行c的值为6000--实际上我需要写“== 6000”)。 – thescoop

+0

因此,您是否可以通过使用条件来删除该行,与选择时相同? – Thanos

+0

是的,对不起,也许我没有说清楚?! – thescoop

1

如果您想要删除该行而不是保留该行,只需使用~运算符来反转布尔向量即可。

df2 = df[~((df.c > 5000) & (df.b < 800))] 
1

你可以得到你想要

indices = df[(df.c > 5000) & (df.b < 800)].index 

删除并删除它们像(就地)指标:

df.drop(indices, inplace=True) 

如果你也想重置索引,然后执行

df = df.drop(indices).reset_index(drop=True)