如果列的总和等于单个列

时间:2016-05-05 14:20:05

标签: python pandas

我有一个如下所示的数据框:

 Id   Var1_Belgium   var1_France  var1_Germany
 x     1               2            0
 y     1               0            0
 z     0               2            0
 u     1               3            2
 v     1               0            4

我想要的是放弃我只在一个国家/地区观察信息的任何行。 因此,如果除了一个之外的所有国家/地区的值都等于零,我想省略该行。 数据框中有数十个国家/地区。

考虑这个问题的另一种方法是,如果所有var1的总和等于var1的单个列,则应删除该行。不确定这是否更容易。

这是应该发生的事情:

 Id   Var1_Belgium   var1_France  var1_Germany
 x     1               2            0
 u     1               3            2
 v     1               0            4

因此,应该删除只有一个国家/地区具有非零值的任何行。

注意:列数和变量多于上面的列。

我正在尝试为数百万观察的df做这个,有效的方法是最好的。

3 个答案:

答案 0 :(得分:2)

您可以使用filter()仅选择var1_个列,然后使用(r != 0).sum()条件 - 它会为您提供0(False)和{{1}的总和(真)。因此,如果总和大于1 - 则意味着多个国家/地区的值不为零:

1

结果

In [52]: df
Out[52]:
   Id  var1_Belgium  var1_France  var1_Germany
0   1             0            0           122
1   2             0          100           120
2   3           100            0             0
3   4             5            6             7
4   5            11           12            13

In [55]: df.filter(like='var1_').apply(lambda r: (r != 0), axis=1)
Out[55]:
  var1_Belgium var1_France var1_Germany
0        False       False         True
1        False        True         True
2         True       False        False
3         True        True         True
4         True        True         True


In [53]: df.filter(like='var1_').apply(lambda r: (r != 0).sum() > 1, axis=1)
Out[53]:
0    False
1     True
2    False
3     True
4     True
dtype: bool

答案 1 :(得分:1)

IIUC然后我认为这应该有效:

In [314]:
df[(df.ix[:,'Var1_Belgium':] == 0).sum(axis=1) < len(df.ix[:,'Var1_Belgium':].columns) - 1]

Out[314]:
  Id  Var1_Belgium  var1_France  var1_Germany
0  x             1            2             0
3  u             1            3             2
4  v             1            0             4

因此,这只比较国家/地区列与0sum的比较,并将其与列数进行比较 - 1并屏蔽符合条件的行/

或更简单:

In [315]:
df[(df.ix[:,'Var1_Belgium':] != 0).sum(axis=1) >  1]

Out[315]:
  Id  Var1_Belgium  var1_France  var1_Germany
0  x             1            2             0
3  u             1            3             2
4  v             1            0             4

答案 2 :(得分:1)

最简单的方法是使用iloc来选择所有列而不用第一个:

foreach (ManagementObject o in res.Get())
{
     string sCaption = o["Caption"].ToString();
     if(sCaption.Contains("ATA"))
     {
          Console.WriteLine("SATA Drive");
          break;
     }
}

也许最好的是组合EdChumMaxU解决方案:

print df[(df.iloc[:,1:] != 0).sum(axis=1) > 1]

  Id  Var1_Belgium  var1_France  var1_Germany
0  x             1            2             0
3  u             1            3             2
4  v             1            0             4

<强>计时

print df[(df.filter(like='var1') != 0).sum(1) > 1]
  Id  var1_Belgium  var1_France  var1_Germany
0  x             1            2             0
3  u             1            3             2
4  v             1            0             4