#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