如果给定的一组列中的所有值都是 0,我如何删除一行

How can I drop a row if all values in a given set of columns are 0

我有一个包含大约 8000 条记录的数据框,我想遍历并删除列 1/1/2015 - 1/1/2030 等于 0 的所有行(列标记为 1/1/ 2015 年、2016 年 1 月 1 日等)。这是我的代码:

find_zeros = 0
for index, row in df.iterrows():
    for z in range(2015,2031):
        find_zeros += row['1/1/%s' %(z)]
    if (find_zeros <= 0):
        df.drop(index, inplace=True)

我一直 运行 处理很多问题,所以我想知道您是否知道如何使这段代码正常工作,或者是否有更好的方法。

作为参考,这里有一个 df 的例子:

   name      1/1/2015 1/1/2016 1/1/2017
   a           0.0      0.0      0.0
   b           0.0      0.0      1.0
   c           0.0      0.0      0.0
   d           1.0      0.0      0.0
   e           0.0      0.0      1.0
   f           0.0      0.0      0.0

预期结果:

 name      1/1/2015 1/1/2016 1/1/2017
   b           0.0      0.0      1.0
   d           1.0      0.0      0.0
   e           0.0      0.0      1.0

我们可以过滤以保留 cols:

子集中不是 all the values are (eq) 0 的值
cols = [f'1/1/{v}' for v in range(2015, 2018)]  # change upper bound to 2031
df = df[~df[cols].eq(0).all(axis=1)]

或其中 any are not equal (ne) 到子集中的 0:

cols = [f'1/1/{v}' for v in range(2015, 2018)]  # change upper bound to 2031
df = df[df[cols].ne(0).any(axis=1)]

*如果从此选择创建新的 DataFrame,请注意:

new_df = df[df[cols].ne(0).any(axis=1)]
需要

copyreset_indexloc 以避免以后出现 SettingWithCopyWarning.

例如,

new_df = df[df[cols].ne(0).any(axis=1)].copy()

示例数据:

df = pd.DataFrame({
    'name': {0: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'},
    '1/1/2015': {0: 0.0, 1: 0.0, 2: 0.0, 3: 1.0, 4: 0.0, 5: 0.0},
    '1/1/2016': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0},
    '1/1/2017': {0: 0.0, 1: 1.0, 2: 0.0, 3: 0.0, 4: 1.0, 5: 0.0}
})
  name  1/1/2015  1/1/2016  1/1/2017
0    a       0.0       0.0       0.0
1    b       0.0       0.0       1.0
2    c       0.0       0.0       0.0
3    d       1.0       0.0       0.0
4    e       0.0       0.0       1.0
5    f       0.0       0.0       0.0

示例输出:

  name  1/1/2015  1/1/2016  1/1/2017
1    b       0.0       0.0       1.0
3    d       1.0       0.0       0.0
4    e       0.0       0.0       1.0