我有一个熊猫Df,具有120万行* 10列。
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中完成呢???
答案 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_index
与last_valid_index
和mask
一起使用:
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