提取熊猫中的连续负值

时间:2020-06-04 10:04:21

标签: python pandas

我有这个df

         col
252      73.9

253     -71.8

254     -314.6

255     -202

256     -19.4

257      46.9

258      139.4

,我想从-ve中提取连续的253 to 256值。我已经尝试过(df.col < 0) & (df.col.shift(1) < 0),但它得到了254 to 256,但却错过了253。我应该如何更改它以获得所需的值?

4 个答案:

答案 0 :(得分:4)

如果您只对索引感兴趣:

df.loc[df.lt(0).col].index.tolist()

[253, 254, 255, 256]

如果您需要连续值的数据框:

df.loc[df.lt(0).col]

      col
253 -71.8
254 -314.6
255 -202.0
256 -19.4

答案 1 :(得分:4)

仅过滤负值,而不是连续的负值的解决方案:

要提高性能,请通过boolean indexing中的一列index屏蔽col值:

df.index[df.col.lt(0)].tolist()

对于过滤所有列loc并不重要,它用于过滤列和掩码:

df[df.col.lt(0)]

#for filter only one column to Series
df.loc[df.col.lt(0), 'col']

#for filter only one column to DataFrame
df.loc[df.col.lt(0), ['col']]

要过滤连续的底片,请使用:

print (df)
       col
252   73.9
253  -71.8
254 -314.6
255 -202.0
256  -19.4
257   46.9
258 -202.0 <- removed, because not consecutive.
259  139.4


m = df.col.lt(0)

df = df[(~m).cumsum()[m].duplicated(keep=False).reindex(df.index, fill_value=False)]
print (df)
       col
253  -71.8
254 -314.6
255 -202.0
256  -19.4

另一种解决方案:

m = df.col.lt(0)

df = df[ m.ne(m.shift()).cumsum().duplicated(keep=False) & m]

答案 2 :(得分:1)

使用.loc访问器选择253256df.loc[253:256,:]) 布尔选择和掩码值小于零的值

df=(df[df.loc[253:256,:]<0]).dropna() 

    col1
253 -71.8
254 -314.6
255 -202.0
256 -19.4

请列出

df[df.loc[253:256,:]<0].index.tolist()

 [253, 254, 255, 256]

答案 3 :(得分:0)

赞:

id     brand_id      pickup_time     delivery_time
1      1             08:00           15:00 
1      1             09:00           16:00
1      1             10:00           17:00
1      1             11:00           18:00