我正在尝试逐行比较数据框的不同列
for (i= startday to endday)
if(df[i]<df[i+1])
counter=counter+1
else
i=endday+1
目标是发现增加(或减少)趋势(需要连续) 我的数据看起来像这样
df= 1 2 3 0 1 1 1
1 1 1 1 0 1 2
1 2 1 0 1 1 2
0 0 0 0 1 0 1
(在此示例中,开始日期到结束日期为7,但实际上这两个值不稳定)
因此,我希望找到这个{2,0,1,0},由于我的数据很大(120万),因此我需要它能够快速运行。由于时间限制,我尝试不使用循环(例如,如果有的话)
我尝试了下面的代码,但是在条件为假的情况下找不到停止计数的方法
import math
import numpy as np
import pandas as pd
df1=df.copy()
df2=df.copy()
bool1 = (np.less_equal.outer(startday.startday, range(1,13))
& np.greater_equal.outer(endday.endday, range(1,13))
)
bool1= np.c_[np.zeros(len(startday)),bool1].astype('bool')
bool2 = (np.less_equal.outer(startday2.startday2, range(1,13))
& np.greater_equal.outer(endday2.endday2, range(1,13))
)
bool2= np.c_[bool2, np.zeros(len(startday))].astype('bool')
df1.insert(0, 'c_False',math.pi)
df2.insert(12, 'c_False',math.pi)
#df2.head()
arr_bool = (bool1&bool2&(df1.values<df2.values))
df_new = pd.DataFrame(np.sum(arr_bool , axis=1),
index=data_idx, columns=['coll'])
df_new.coll= np.select( condlist = [startday.startday > endday.endday],
choicelist = [-999],
default = df_new.coll)
答案 0 :(得分:1)
在末尾添加零,然后使用np.diff
,然后使用argmin
得到第一个“非正数”:
(np.diff(np.hstack((df.values, np.zeros((df.values.shape[0], 1)))), axis=1) > 0).argmin(axis=1)
>> array([2, 0, 1, 0], dtype=int64)