Как создать более эффективный логический код, который сравнивает несколько строк одного столбца с другим?

#python #python-3.x #pandas #numpy

#python #python-3.x #pandas #numpy

Вопрос:

Мне нужен эффективный и общий подход к созданию нового логического столбца во фрейме данных, основанный на сравнении нескольких строк столбца с несколькими строками другого столбца (ов). Под множественными строками я подразумеваю текущую строку столбца и одно или более задержек этого столбца (т. е. df[‘column’].shift(1). Прямо сейчас я создаю логическое сравнение для каждого столбца в моем фрейме данных. В приведенном ниже примере у меня всего 3 столбца. Я надеюсь, что есть способ использовать any () или all () для создания более эффективного логического сравнения для случая, когда у меня может быть 50 столбцов для проверки.

Я уже успешно создал столбец, написав подробные условия для каждого столбца и поместив критерии в оператор np.where(). Этот подход не сработает, если мне придется проверять 50 столбцов.

Этот код создает исходный фрейм данных:

 import numpy as np
import pandas as pd
df = pd.DataFrame({'C1':[3,2,8,6,6,7,8],'C2':[5,4,6,4,8,3,2],'C3': [5,4,6,7,8,6,4],
                   'Year':[2012,2013,2014,2015,2016,2017,2018]})
df.set_index('Year', inplace=True)
df1 =df[::-1]
df1
  

Для примера, который я привожу, я стремлюсь создать столбец ‘Success’, который равен 1, если столбец cany равен 8, а столбец под ним (предыдущий год) меньше 8. Вот что я сделал до сих пор:

 Criteria_1 = ( (df1['C1']==8) amp; (df1['C1'] > df1['C1'].shift(-1) ) |
               (df1['C2']==8) amp; (df1['C2'] > df1['C2'].shift(-1) )|
               (df1['C3']==8) amp; (df1['C3'] > df1['C3'].shift(-1) )
              )
df1['Sucess']=np.where(Criteria_1,1,0)
  

Я хотел бы видеть тот же результат, что и в приведенном выше коде, но с более кратким кодом, использующим, возможно, any (), чтобы я мог сказать, соответствует ли какой-либо столбец вышеуказанному условию, успех должен быть равен 1.введите описание изображения здесь

Комментарии:

1. Почему строка 2014 помечена как 1?

2. ваше право, это ошибка. Это должно быть ноль.

Ответ №1:

Может быть что-то вроде:

 df1 =df[::-1].copy()
df1['Success']=(df1.eq(8)amp;df1.gt(df1.shift(-1))).any(axis=1).astype(int)
print(df1)
  

       C1  C2  C3  Success
Year                     
2018   8   2   4        1
2017   7   3   6        0
2016   6   8   8        1
2015   6   4   7        0
2014   8   6   6        1
2013   2   4   4        0
2012   3   5   5        0