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

时间:2019-02-06 14:24:25

标签: python python-3.x pandas

我有一个熊猫Df,具有120万行* 10列。

例如,我的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中完成呢???

3 个答案:

答案 0 :(得分:3)

首先比较列a等于不等于ne,然后获得累加和,然后再次比较,按交换顺序按[::-1]创建另一个掩码,作为交换顺序,最后按{过滤{3}}:

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

如果0列中只有a个值,则解决方案运行良好:

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: []

答案 1 :(得分:1)

另一种使用df.iloc[]

的方法
m=df[df.a.ne(0)]
df.iloc[m.index[0]:m.index[1]+1]

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

答案 2 :(得分:1)

first_valid_indexlast_valid_indexmask一起使用:

mask = df2['a'].mask(df2['a'] == 0)
start = mask.first_valid_index()
end = mask.last_valid_index()
df2.loc[start:end]

输出:

       Time    a  b    c
Index                   
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