我有一个包含 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/