Skip to main content
 首页 » 编程设计

python之如何找到第一个非零元素和最后一个非零元素并修剪它

2025年05月04日20birdshome

我有一个包含 120 万行 *10 列的 Pandas Df。

例如我的 DF 看起来像

Index     Time  a   b   c 
0         1     0   1   0 
1         2     0   0   1 
2         3     0.3 0   1.5 
3         4     0   1   0 
4         5     0   0   5   
5         6     1   0   0 
6         7     0   0   0 
7         8     0   1   5 

我想消除列“a”的第一个非零索引之前和列“a”的最后一个非零索引之后的数据框行。在上述情况下,结果应如下所示:

我的需求

Index         Time  a   b   c 
    0         3     0.3 0   1.5 
    1         4     0   1   0 
    2         5     0   0   5   
    3         6     1   0   0

我发现发布了同样的问题 Same requirement , 但是那里他用R来做操作... 我怎样才能在 python 中做到这一点????

请您参考如下方法:

首先比较列 a 是否不等于 ne ,然后获取累计和,并再次比较,通过 [::-1] 的更改顺序创建另一个掩码用于交换顺序和最后一个过滤器 boolean indexing :

m = df['a'].ne(0) 
df = df[m.cumsum().ne(0) & m[::-1].cumsum().ne(0)] 
 
print (df) 
   Time    a  b    c 
2     3  0.3  0  1.5 
3     4  0.0  1  0.0 
4     5  0.0  0  5.0 
5     6  1.0  0  0.0 

如果 a 列中只有 0 值,解决方案工作良好:

print (df) 
   Time  a  b  c 
0     1  0  1  0 
1     2  0  0  1 
6     7  0  0  0 
7     8  0  1  5 
 
m = df['a'].ne(0) 
df = df[m.cumsum().ne(0) & m[::-1].cumsum().ne(0)] 
print (df) 
Empty DataFrame 
Columns: [Time, a, b, c] 
Index: []