Из того, как я интерпретировал ваш вопрос d
не следует включать. Это с 18 - 18 = 0 < 8
Несмотря на это, я применил трехэтапный подход к этой проблеме.
# Get the desired reference value
last_entry = df.iloc[-1][col2]
# Select only rows whose difference is at least 8
# Or the case where it is the last entry
qry = "{ref}-col2 >= 8 or index=={idx}".format(ref=last_entry, idx=len(df)-1)
diff_gt_8 = df.query(qry)
# For each value of col3 get a list of values of col1 and convert to DataFrame
pd.DataFrame( diff_gt_8.groupby(col3)[col1].apply(list) )
Для сравнения с вашим предыдущим значением:
df[(df[col2] - df[col2].shift(1)) < 12]
Обратите внимание, что df[col2].shift(1)
возвращает серию со всеми строками, уменьшенными на 1. Таким образом, мы можем сравнить строку в df[col2]
с предыдущей строкой.
Первое значение никогда не будет включено, так как это NaN (не число).
UPDATE
Если я правильно понял ваш новый вопрос, это то, что вы хотите.
last_two_rows = df.iloc[-2:, :] # Select last two rows
if (last_two_rows.iloc[-1][col2] - last_two_rows.iloc[-2][col2]) < 12:
last_two_rows[col1].iloc[-2] = np.nan
last_two_rows[[col1]]