找出满足熊猫条件的连续元素



我有一个简单的数据帧,列为"Quarter"one_answers"Growth",当太连续的条目为负数时,我想找到第一个实例。

df = pd.DataFrame({
'Quarters': ['2000q1','2000q2','2000q3','2OOOq4','2001q1','2001q2','2001q3'],
'Growth': [np.nan,10,20,-5,-6,10,-8]})

(第一个条目是NAN,因为"增长"来自于计算条目之间的差异(。

我希望代码输出"2001q1",这是连续两次负增长的第一次出现。谢谢

如果总是存在至少一对链2掩码被&用于逐位AND,则第二个掩码与第一个相同,仅被Series.shift移位值,然后由Series.idxmax得到第一个True,并由DataFrame.loc:选择

a = df.loc[(df['Growth'].lt(0) & df['Growth'].shift().lt(0)).idxmax(), 'Quarters']
print (a)
2001q1

如果不确定是否存在1对,则使用nextiter作为可能,如果不匹配,则指定默认值:

mask = (df['Growth'].lt(0) & df['Growth'].shift().lt(0))
a =  next(iter(df.loc[mask, 'Quarters']), 'no exist 2 negative values')
print (a)
2001q1

更改的数据示例:

df = pd.DataFrame({
'Quarters' : ['2000q1','2000q2','2000q3','2004q4','2001q1','2001q2','2001q3'],
'Growth' : [np.nan,10,20,5,-6,10,-8]})
print (df)
Quarters  Growth
0   2000q1     NaN
1   2000q2    10.0
2   2000q3    20.0
3   2004q4     5.0
4   2001q1    -6.0
5   2001q2    10.0
6   2001q3    -8.0
mask = (df['Growth'].lt(0) & df['Growth'].shift().lt(0))
a =  next(iter(df.loc[mask, 'Quarters']), 'no exist 2 negative consecutive values')
print (a)
no exist 2 negative consecutive values
import numpy as np
import pandas as pd
df = pd.DataFrame({
'Quarters' :['2000q1','2000q2','2000q3','2OOOq4','2001q1','2001q2','2001q3'],
'Growth' : [np.nan,10,20,-5,-6,10,-8]})
flag=0
for index, rows in df.iterrows():
if rows['Growth']<0 and flag<0:
print(rows['Quarters'])
break
flag=rows['Growth']

说明:使用iterrows((,我们可以在数据帧上循环flag变量帮助我们在当前值之前存储"Quarter"的"Growth"值。

将DataFrame.shift¶和DataFrame.le链接到基准帧内的布尔选择

a,*b,= df.loc[df.Growth.le(0)&df.Growth.shift().le(0),'Quarters'].values.tolist()
print(a)

解释

df.loc[df.Growth.le(0)&df.Growth.shift().le(0),'Quarters'].values.tolist()#Boolean select consecutive negative numbers in column Quaters into a list
a,*b,=x# Unpack list x giving the first element

'2001q1'

最新更新