Python: поиск максимального значения из нескольких столбцов в Pandas Dataframe

Я новичок в Python и пытаюсь сравнить несколько столбцов в фрейме данных pandas. Столбцы представляют месяцы, и я пытаюсь просмотреть период x месяцев и отметить, имела ли строка i и т. д. значение 2 или более.

Ниже приведен код, который я использовал для создания моего примера df:

arr_random = np.random.randint(low=0, high=5, size=(100,26))
arr_random
col_names = []
i = 0
while i <= 25:
    col_names.append('mth_'+str(i))
    i = i + 1
rand_df = pd.DataFrame(arr_random, index = None, columns = col_names)

Я хочу, чтобы мои флаги были такими: 1 = 2+, 0 = <2, -1 = отсутствующие данные (обычно я устанавливаю значения NaN равными -1). Ниже приведен код, который я использую для этого:

review_months = [12, 18, 24]
for x in review_months: #check this
    rand_df['TWOPLUS_'+str(x)+'M'] = -1
    for i in range(x): 
        rand_df['TWOPLUS_'+str(x)+'M'] = rand_df[['TWOPLUS_'+str(x)+'M', 'mth_'+str(i+1)]].max(axis = 1)
        conditions  = [ rand_df['TWOPLUS_'+str(x)+'M'] >= 2, rand_df['TWOPLUS_'+str(x)+'M'] < 2, rand_df['mth_'+str(i)] == -1 ]
        choices     = [ 1 , 0, -1 ]
        rand_df['TWOPLUS_'+str(x)+'M'] = np.select(conditions, choices, default=np.nan)

Единственная проблема заключается в том, что я не получаю статус, если в строке КОГДА-ЛИБО было 2 или более в одном из столбцов за заданный период времени, он возвращается только в том случае, если в данный момент у них есть 2 или более для указанного столбца.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать следующий код, чтобы проверить, имел ли фрейм данных когда-либо значение 2 или больше.

for month in (12, 18, 24):
    rand_df[f'TWOPLUS_{month}M'] = (rand_df.loc[:, rand_df.columns[:month+1]] >= 2).any(axis=1).astype(int)
    rand_df[f'TWOPLUS_{month}M'].fillna(-1, inplace=True)

rand_df

Он выбирает столбцы до желаемого месяца и проверяет, равно ли каждое значение во фрейме данных хотя бы 2. Затем он использует any(axis=1), чтобы проверить, является ли какое-либо значение истинным в каждой строке. Наконец, он преобразует его в 1, если какое-либо значение в строке равно True, иначе 0. NaN заменяются на -1.

Вот ссылка на документацию для любого метода https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.any.html и для использования pandas .loc https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.loc.html

Выход

мт_0 мт_1 мт_2 мт_3 mth_4 мт_5 mth_6 mth_7 mth_8 mth_9 ... mth_19 mth_20 mth_21 mth_22 mth_23 mth_24 mth_25 ДВАПЛЮС_12М ДВАПЛЮС_18М ДВАПЛЮС_24М 0 1 0 3 1 4 3 4 0 0 2 ... 4 4 0 1 0 1 2 1 1 1 1 0 0 3 4 4 1 0 1 4 2 ... 0 2 2 0 3 3 1 1 1 1 2 1 1 0 1 2 4 2 0 0 0 ... 3 2 2 1 3 4 0 1 1 1 3 3 3 2 4 1 0 4 4 0 2 ... 0 2 2 2 2 0 4 1 1 1 4 1 0 4 3 0 2 2 1 0 1 ... 3 0 1 2 1 3 0 1 1 1 ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... 95 3 1 0 1 4 3 2 1 0 2 ... 4 4 2 1 2 2 0 1 1 1 96 2 2 1 3 2 4 0 4 0 3 ... 2 2 3 4 4 1 4 1 1 1 97 3 1 1 4 4 3 0 0 2 0 ... 2 3 3 3 2 3 4 1 1 1 98 2 2 4 3 3 1 3 2 2 0 ... 1 0 3 2 3 1 1 1 1 1 99 4 3 0 1 3 4 0 3 0 4 ... 3 3 0 4 3 3 0 1 1 1

Другие вопросы по теме