首页 > 解决方案 > 如果给定列集中的所有值都是 0,我如何删除一行

问题描述

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

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

标签: pythonpandasdrop

解决方案


我们可以过滤以保留并非所有值都为 ( eq ) 0 的子集中的值cols

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)]

任何不等于 ( 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)]

copyor reset_indexorloc将需要避免以后的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

推荐阅读