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

标签 python python-3.x pandas

我有一个包含 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: []

关于python - 如何找到第一个非零元素和最后一个非零元素并修剪它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54555842/

相关文章:

python - 获取字符串之间的子字符串。但启动发生了多次

python - 列表可以转换为整数吗

python - 转换 timedelta hh :mm to seconds

python pandas,某些列到行

python - heroku 上的 Peewee 和 postgres,无法创建表

python - 如何在 Pandas 中读取 lz4 压缩文件?

python - 如何用 Python(NumPy、SciPy 等)求解 AX = B 方程,其中 A、X、B 是矩阵,X 的所有元素必须是非负数

python - 确保 matplotlib 颜色条在多个图形中看起来相同

python - 如何将值传递给 Popen.subprocess 内的方法参数?

python - db.Model 类变量和 __init__