Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于列值删除熊猫中的数据帧行_Python_Pandas - Fatal编程技术网

Python 基于列值删除熊猫中的数据帧行

Python 基于列值删除熊猫中的数据帧行,python,pandas,Python,Pandas,我有以下数据帧: 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

我有以下数据帧:

             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\u race
等于
0
的行。做这件事最有效的方法是什么?

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

df = df[df.line_race != 0]

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

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\u race!=0')
但是对于任何未来的旁路,您可以提到,
df=df[df.line\u race!=0]
在尝试筛选
缺失值时不会做任何事情

是否有效:

df = df[df.line_race != 0]
df = df[df.line_race.notnull()]
什么都不做:

df = df[df.line_race != None]
是否有效:

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

给出的答案是正确的,正如上面有人所说,您可以使用
df.query('line\u race!=0')
,这取决于您的问题,速度要快得多。强烈推荐。

只需添加另一个解决方案,特别是在您使用新的pandas评估器时,其他解决方案将替换原来的pandas并失去评估器

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

另一种方法。可能不是最有效的方法,因为代码看起来比其他答案中提到的代码复杂一点,但仍然是做同样事情的替代方法

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

虽然前面的答案与我将要做的几乎相似,但使用index方法并不需要使用另一个索引方法。loc()。这可以用类似但精确的方式来完成

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

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

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

要删除所有值为0和10的行,只需为扩展到所有列的数据帧添加另一种方式:

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

我编译并运行我的代码。这是准确的代码。你可以自己试试

data = pd.read_excel('file.xlsx')
如果列名中有任何特殊字符或空格,可以将其写入
'
中,就像在给定代码中一样:

data = data[data['expire/t'].notnull()]
print (date)
如果只有一个字符串列名,没有任何空格或特殊字符 你可以直接访问它

data = data[data.expire ! = 0]
print (date)
如果有多个值和str数据类型 我使用以下方法过滤列中的给定值:

def filter_rows_by_values(df, col, values):
return df[df[col].isin(values) == False]
例如:

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
在数据帧中,我想删除列“str”中值为“b”和“c”的行


增加一种方法来实现这一点

 df = df.query("line_race!=0")

其中一种有效且全面的方法是使用
eq()
方法:

df[~df.line_race.eq(0)]


查询看起来非常有用!谢谢
查询的良好更新
。它允许更丰富的选择标准(例如,类似set的操作,如
df.query('variable in var_list')
,其中'var_list'是所需值的列表)如果列名中有空格,这将如何实现?
query
如果列名中有空格,则不太有用。如果
df=df.rename(columns=lambda x:x.strip().replace('','')
,如果
df
很大,这会占用更多内存吗?或者,我可以就地执行吗?只需在一个有2M行的
df
上运行,运行速度非常快。@vfxGer如果列中有空格,如“line race”,则可以执行
df=df[df['line race'!=0]
如果要删除整行(如果在该行的任何列中发现有问题的值),我们将如何修改此命令?谢谢!Fwiw,对我来说,这必须是
df=df[~df['DATE'].isin(['2015-10-30.1','2015-11-30.1','2015-12-31.1'])
如果你有像我这样的长
DataFrame
变量名(并且,我冒昧地猜测,与示例中使用的
df
相比,每个人都有可能是重复的),这一点特别有用,因为你只需要写一次。如果我们不知道列名怎么做?可以做
df=df[df.columns[2].notnull()]
,但无论如何,你需要能够以某种方式索引列。
df=df[df.line\u race!=0]
删除行,但也不会重置索引。因此,当您在df中添加另一行时,它可能不会在末尾添加。我建议在该操作之后重置索引(
df=df.reset_index(drop=True)
),您永远不要将
=
操作符与None进行比较。对于
None
值,您可以使用
is
代替
=
不是
代替
=,如本例中的
df=df[df.line\u race不是None]
将起作用写入索引和替换的目的是什么。有人能解释一下吗?我想如果有人最终使用索引访问器,我们也需要
.reset_index()
,这样对大型数据集或内存受限的情况更好+1如果您有多个要删除的值,例如,
drop=[0,10]
然后是类似于
df[(df.line\u race!=drop)]
的建议,有没有更有效的方法来执行此操作
df[(df.line\u race!=drop)]
不起作用,但我想有可能做得更有效。我现在没有解决方案,但是如果有人有,请现在就告诉我们。df[~(df[“line_race”].isin([0,10])如果您需要任何其他帮助,我在这里。这是一个非常有用的小函数。谢谢。我也喜欢这个。可能已经完全过时,但添加了一个小参数,可以帮助我决定是选择还是删除它。如果要将df一分为二,请使用此工具:
def filter_rows_by_value(df,col,values,true或false=false):返回df[df[col].isin(values)==true或false]