我有以下数据框架:

             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。最有效的方法是什么?


当前回答

以防您需要删除行,但值可以在不同的列中。 在我的情况下,我使用百分比,所以我想删除在任何列中值为1的行,因为这意味着它是100%

for x in df:
    df.drop(df.loc[df[x]==1].index, inplace=True)

如果df有太多列,则不是最优的。

其他回答

提供了这么多选项(或者可能我没有太注意,如果是这样的话,很抱歉),但没有人提到这一点: 我们可以在pandas中使用这种符号:~(这给了我们条件的倒数)

df = df[~df["line_race"] == 0]

对于像这样的简单示例,这没有太大区别,但对于复杂的逻辑,我更喜欢在删除行时使用drop(),因为它比使用反向逻辑更直接。例如,删除A=1和(B=2或C=3)的行。

下面是一个易于理解并能处理复杂逻辑的可伸缩语法:

df.drop( df.query(" `line_race` == 0 ").index)

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

data = pd.read_excel('file.xlsx')

如果你在列名中有任何特殊字符或空格,你可以像给定的代码中那样写:

data = data[data['expire/t'].notnull()]
print (date)

如果只有一个字符串列名,没有任何空格或特殊字符 字符你可以直接访问它。

data = data[data.expire ! = 0]
print (date)

只是为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

如果你想根据列的多个值删除行,你可以使用:

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

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