我有一个简单的数据帧,列为"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对,则使用next
和iter
作为可能,如果不匹配,则指定默认值:
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'