我有一个如下所示的数据框:
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做这个,有效的方法是最好的。
答案 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
因此,这只比较国家/地区列与0
和sum
的比较,并将其与列数进行比较 - 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;
}
}
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