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