如何根据条件删除数据框行

时间:2019-07-26 16:45:10

标签: python python-3.x pandas

以下是数据框(csv):

Time                 Longitude      Latitude    SSHA
11/22/2013 8:57     -123.603607     81.377536   0.348
11/22/2013 8:57     -124.017502     81.387791   0.386
11/22/2013 8:57     -124.432344     81.397611   0.383
11/22/2013 8:57     -124.848099     81.406995   0.405
11/22/2013 8:57     -125.264724     81.415942   --
...                  ...            ...         ...

我想消除经度小于0且大于40的所有行。但是,当我输入脚本时,它不起作用。

import pandas as pd
import numpy
df =pd.read_csv(r"C:\\Users\\chz08006\\Documents\\Results1\\BlockIsland25Test.csv")

indexNames=df[(df['Longitude'] <= 0) & (df['Longitude']>=40)].index
df.drop(indexNames,inplace=True)
df

如果我只是输入

indexNames=df[(df['Longitude'] <= 0)].index
df.drop(indexNames,inplace=True)
df

它工作正常。但是,当我添加& (df['Longitude']>=40)时,数据框没有任何变化!我什至没有收到错误。

2 个答案:

答案 0 :(得分:0)

据我所知,除非有一种优雅的方法,否则这不会帮助您。

只是一个示例数据集:

>>> import pandas as pd
>>> import numpy as np
>>> df
   col1 col2
0   123    A
1   123    A
2   456    B
3   456    A
4   -12    C
5    41    D

因此,如果您甚至使用np.bitwise_and运算符进行测试,都可以看到布尔返回False。因此,这将无济于事...

>>> np.bitwise_and(df.col1 <= 0, df.col1 >= 40)
0    False
1    False
2    False
3    False
4    False
5    False
Name: col1, dtype: bool

>>> df[np.bitwise_and(df.col1 <= 0, df.col1 >= 40)]
Empty DataFrame
Columns: [col1, col2]
Index: []

只有以下解决方法可以解决此问题,直到您找到完美的方法为止。

>>> df.drop(df.loc[df['col1'] <=0].index, inplace=True)
>>> df.drop(df.loc[df['col1'] >= 123].index, inplace=True)
>>> df
   col1 col2
5    41    D

希望,这会有所帮助。

答案 1 :(得分:0)

如@Joseph Crispell所述,这里的主要问题是x<=0 & x>=40将始终返回False。因此,当实例化indexNames时,它为空,因此没有要删除的索引。

正如@Erfran指出的那样,使用df[(df['Longitude'] <= 0) |(df['Longitude']>=40)]可能会更容易。

但是不清楚您是要说|还是要查找0到40(含)之间的值,在这种情况下,代码看起来像是:df[(0 <= df['Longitude'] <= 40)]