Как создать более эффективный логический код, который сравнивает несколько строк одного столбца с другим? - PullRequest
2 голосов
/ 04 апреля 2019

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

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

Этот код создает исходный кодdataframe:

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) & (df1['C1'] > df1['C1'].shift(-1) ) |
               (df1['C2']==8) & (df1['C2'] > df1['C2'].shift(-1) )|
               (df1['C3']==8) & (df1['C3'] > df1['C3'].shift(-1) )
              )
df1['Sucess']=np.where(Criteria_1,1,0)

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

1 Ответ

4 голосов
/ 04 апреля 2019

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

df1 =df[::-1].copy()
df1['Success']=(df1.eq(8)&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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...