如果给定的一组列中的所有值都是 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)]
需要 copy
或 reset_index
或 loc
以避免以后出现 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
我有一个包含大约 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
:
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)]
需要 copy
或 reset_index
或 loc
以避免以后出现 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