根据列值删除Pandas中的DataFrame行


506

我有以下DataFrame:

             daysago  line_race rating        rw    wrating
 line_date                                                 
 2007-03-31       62         11     56  1.000000  56.000000
 2007-03-10       83         11     67  1.000000  67.000000
 2007-02-10      111          9     66  1.000000  66.000000
 2007-01-13      139         10     83  0.880678  73.096278
 2006-12-23      160         10     88  0.793033  69.786942
 2006-11-09      204          9     52  0.636655  33.106077
 2006-10-22      222          8     66  0.581946  38.408408
 2006-09-29      245          9     70  0.518825  36.317752
 2006-09-16      258         11     68  0.486226  33.063381
 2006-08-30      275          8     72  0.446667  32.160051
 2006-02-11      475          5     65  0.164591  10.698423
 2006-01-13      504          0     70  0.142409   9.968634
 2006-01-02      515          0     64  0.134800   8.627219
 2005-12-06      542          0     70  0.117803   8.246238
 2005-11-29      549          0     70  0.113758   7.963072
 2005-11-22      556          0     -1  0.109852  -0.109852
 2005-11-01      577          0     -1  0.098919  -0.098919
 2005-10-20      589          0     -1  0.093168  -0.093168
 2005-09-27      612          0     -1  0.083063  -0.083063
 2005-09-07      632          0     -1  0.075171  -0.075171
 2005-06-12      719          0     69  0.048690   3.359623
 2005-05-29      733          0     -1  0.045404  -0.045404
 2005-05-02      760          0     -1  0.039679  -0.039679
 2005-04-02      790          0     -1  0.034160  -0.034160
 2005-03-13      810          0     -1  0.030915  -0.030915
 2004-11-09      934          0     -1  0.016647  -0.016647

我需要删除line_race等于的行0。最有效的方法是什么?


Answers:


874

如果我理解正确,它应该很简单:

df = df[df.line_race != 0]

16
如果df很大,这会花费更多的内存吗?或者,我可以就位吗?
源2015年

10
只需在df具有200万行的a 上运行它,就可以很快完成。
Dror

46
@vfxGer如果列中有空格,例如“ line race”,那么您可以这样做df = df[df['line race'] != 0]
Paul

3
如果要删除整行(如果在该行的任何列中找到有问题的值),我们将如何修改此命令?
亚历克斯(Alex)

3
谢谢!Fwiw,对我来说,这必须是df=df[~df['DATE'].isin(['2015-10-30.1', '2015-11-30.1', '2015-12-31.1'])]
citynorman

181

但是对于任何将来的绕过器,您可能会提到df = df[df.line_race != 0]在尝试过滤None/丢失值时不执行任何操作。

可以工作:

df = df[df.line_race != 0]

什么都不做:

df = df[df.line_race != None]

可以工作:

df = df[df.line_race.notnull()]

4
如果我们不知道列名怎么办?
Piyush S. Wanare '18

可以做到df = df[df.columns[2].notnull()],但是您需要以某种方式以某种方式索引该列。
erekalper

1
df = df[df.line_race != 0]删除行,但也不会重置索引。因此,当您在df中添加另一行时,它可能不会在末尾添加。我建议在该操作(df = df.reset_index(drop=True))之后重设索引
-the_new_james

绝对不要将==运算符与“无”进行比较。stackoverflow.com/questions/3257919/...
布拉姆Vanroy

40

最好的方法是使用布尔掩码:

In [56]: df
Out[56]:
     line_date  daysago  line_race  rating    raw  wrating
0   2007-03-31       62         11      56  1.000   56.000
1   2007-03-10       83         11      67  1.000   67.000
2   2007-02-10      111          9      66  1.000   66.000
3   2007-01-13      139         10      83  0.881   73.096
4   2006-12-23      160         10      88  0.793   69.787
5   2006-11-09      204          9      52  0.637   33.106
6   2006-10-22      222          8      66  0.582   38.408
7   2006-09-29      245          9      70  0.519   36.318
8   2006-09-16      258         11      68  0.486   33.063
9   2006-08-30      275          8      72  0.447   32.160
10  2006-02-11      475          5      65  0.165   10.698
11  2006-01-13      504          0      70  0.142    9.969
12  2006-01-02      515          0      64  0.135    8.627
13  2005-12-06      542          0      70  0.118    8.246
14  2005-11-29      549          0      70  0.114    7.963
15  2005-11-22      556          0      -1  0.110   -0.110
16  2005-11-01      577          0      -1  0.099   -0.099
17  2005-10-20      589          0      -1  0.093   -0.093
18  2005-09-27      612          0      -1  0.083   -0.083
19  2005-09-07      632          0      -1  0.075   -0.075
20  2005-06-12      719          0      69  0.049    3.360
21  2005-05-29      733          0      -1  0.045   -0.045
22  2005-05-02      760          0      -1  0.040   -0.040
23  2005-04-02      790          0      -1  0.034   -0.034
24  2005-03-13      810          0      -1  0.031   -0.031
25  2004-11-09      934          0      -1  0.017   -0.017

In [57]: df[df.line_race != 0]
Out[57]:
     line_date  daysago  line_race  rating    raw  wrating
0   2007-03-31       62         11      56  1.000   56.000
1   2007-03-10       83         11      67  1.000   67.000
2   2007-02-10      111          9      66  1.000   66.000
3   2007-01-13      139         10      83  0.881   73.096
4   2006-12-23      160         10      88  0.793   69.787
5   2006-11-09      204          9      52  0.637   33.106
6   2006-10-22      222          8      66  0.582   38.408
7   2006-09-29      245          9      70  0.519   36.318
8   2006-09-16      258         11      68  0.486   33.063
9   2006-08-30      275          8      72  0.447   32.160
10  2006-02-11      475          5      65  0.165   10.698

更新:现在熊猫0.13了,另一种方法是df.query('line_race != 0')



14
的更新良好query。它允许更丰富的选择标准(例如,类似set的操作df.query('variable in var_list'),其中“ var_list”是所需值的列表)
philE

1
如果列名称中有空格,将如何实现?
iNoob 2015年

2
query如果列名中有空格,则它不是很有用。
菲利普·

3
我会避免在标题中使用这样的内容df = df.rename(columns=lambda x: x.strip().replace(' ','_'))
Scientist1642

39

只是添加另一种解决方案,如果您使用的是新的熊猫评估器,这将特别有用,其他解决方案将取代原始的熊猫并失去评估器

df.drop(df.loc[df['line_race']==0].index, inplace=True)

1
编写索引和就位的目的是什么。谁能解释一下?
heman123 '18


我想我们需要.reset_index(),以及如果有人结束了使用索引访问器
AYUSH

15

如果要基于列的多个值删除行,则可以使用:

df[(df.line_race != 0) & (df.line_race != 10)]

为删除所有值为0和10的行line_race


14

给出的答案仍然是正确的,因为上面的人说您可以使用df.query('line_race != 0')它,具体取决于您的问题要快得多。强烈推荐。


如果您拥有DataFrame像我这样的长变量名(并且我敢猜测,与df示例中使用的每个人相比),这特别有用,因为您只需要编写一次即可。
ijoseph '18

9

虽然上一个答案几乎与我要执行的操作类似,但是使用索引方法不需要使用其他索引方法.loc()。可以通过类似但精确的方式完成

df.drop(df.index[df['line_race'] == 0], inplace = True)

1
对于大型数据集或受内存限制的位置解决方案更好。+1
davmor


0

只需为DataFrame添加另一种方法即可扩展所有列:

for column in df.columns:
   df = df[df[column]!=0]

例:

def z_score(data,count):
   threshold=3
   for column in data.columns:
       mean = np.mean(data[column])
       std = np.std(data[column])
       for i in data[column]:
           zscore = (i-mean)/std
           if(np.abs(zscore)>threshold):
               count=count+1
               data = data[data[column]!=i]
   return data,count
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.