У меня есть фрейм данных, например:
A B C
1 11 33
2 15 46
3 12 91
1 8 75
3 35 63
2 22 52
Я создаю столбцы N, M и O на основе этих значений для предыдущих x строк:
- N - число среди тех строк, где B> B этой строки, а C
- M этой строки - число среди тех строк, в которых вышеприведенные условия не выполняются и A == 1
- O - это число, для которого не выполняется ни одно из условий для N, а A! = 1
Первые x строкизатем упал.
(как следствие, N + M + 0 всегда == x )
Ожидаемый результат при x == 2:
A B C N M O
3 12 91 1 0 1
1 8 75 0 1 1
3 35 63 2 0 0
2 22 52 2 0 0
Мое решение, так как я не смог придумать подход чистого панды, состоит в том, чтобы просто перебирать строки и использовать 3 разных счетчика:
x=17 # "17" is not actually hardcoded, it's read from file
for i, row in df.iterrows():
n=0
m=0
o=0
for j in range(1, x+1):
if row.B > df.iloc[i-j].B and row.B < df.iloc[i-j].C:
n+=1
elif df.iloc[i-j].A == 1:
m+=1
else:
o+=1
df.at[i,"N"] = n
df.at[i,"M"] = m
df.at[i,"O"] = o
df=df.iloc[x:]
Это работает, но работаеточевидно, довольно медленный (df большой).Можно ли обойтись без итерации по строкам?Если да, то как?