我有一个如下所示的数据框:
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
我想要的是删除我只观察一个国家信息的任何行。 因此,如果除一个国家以外的所有国家/地区的值(value)都等于零,我想省略该行。 数据框中有几十个国家。
考虑此问题的另一种方法是,如果所有 var1 的总和等于 var1 的单个列,则应删除该行。不确定这是否会使它更容易。
这是应该发生的事情:
Id Var1_Belgium var1_France var1_Germany
x 1 2 0
u 1 3 2
v 1 0 4
因此,应删除只有 1 个国家/地区具有非零值的任何行。
注意:列和变量比上面的多。
我正在尝试为具有数百万个观察值的 df 执行此操作,最好采用有效的方法。
最佳答案
您可以使用 filter()
仅选择 var1_
列,然后使用 (r != 0).sum()
条件- 它会给你 0
(False) 和 1
(True) 的总和。因此,如果总和大于 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
结果
In [54]: df[df.filter(like='var1_').apply(lambda r: (r != 0).sum() > 1, axis=1)]
Out[54]:
Id var1_Belgium var1_France var1_Germany
1 2 0 100 120
3 4 5 6 7
4 5 11 12 13
关于python - 如果列的总和等于单个列,则删除一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37053065/