python - 如果给定列集中的所有值都是 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
解决方案
我们可以过滤以保留并非所有值都为 ( 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)]
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
or reset_index
orloc
将需要避免以后的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
推荐阅读
- python - 使用 numpy 对应行的向量点积
- python-3.x - 播放按钮不起作用
- python - 调用 Python 的多处理函数的最佳位置在哪里?
- c - 无法将参数传递给自写函数
- spring - Spring RequestMapping Controller 注解并在同一个Controller内创建不同的绝对路径
- sql-server - 从 SQL Server 执行 Oracle 11g 函数并将结果插入 SQL 表
- javascript - Javascript如何区分mouseDown、click和doubleClick事件
- laravel - 在 Laravel 7 中使用观察者测试模型
- string - 来自字符串的 Delphi Hash - 小菜一碟?
- pine-script - 一开始就声明变量