Найти первое значение в столбцах dataframe больше другого

1

Я искал наиболее эффективный способ найти первое значение во всех столбцах pandas df слева направо (0,1,2,3) для каждой строки, которая больше, чем другой столбец (t), и поместите соответствующую метку столбца в новый столбец (val). Если значение столбца больше, тогда вместо этого я хочу 0.

По какой-то причине я не мог найти ничего простого и эффективного (так как реальная таблица действительно большая).

Например:

Начальная таблица:

     t    0    1    2    3
JAN  3  1.9  2.1  2.6  2.9
FEB  6  2.0  4.0  5.0  9.0
MAR  2  1.0  3.0  4.0  4.0
APR  4  1.5  5.0  6.0  2.0

Итоговый стол:

     t    0    1    2    3   val
JAN  3  1.9  2.1  2.6  2.9   0
FEB  6  2.0  4.0  5.0  9.0   3
MAR  2  1.0  3.0  4.0  4.0   1
APR  4  1.5  3.0  6.0  2.0   2

Спасибо!

Теги:
pandas

1 ответ

1
Лучший ответ

У вас на самом деле небольшая разница в базовой матрице между вашими начальными и конечными таблицами, и мне потребовалось некоторое время. Значение в строке APR и столбце 1 было изменено с 5.0 до 3.0. Я собираюсь использовать последнюю матрицу здесь.

from io import StringIO
import numpy as np
import pandas as pd

s = """
     t    0    1    2    3
JAN  3  1.9  2.1  2.6  2.9
FEB  6  2.0  4.0  5.0  9.0
MAR  2  1.0  3.0  4.0  4.0
APR  4  1.5  3.0  6.0  2.0
"""

# Read in the string
df = pd.read_csv(StringIO(s), delim_whitespace=True)

# Find all columns greater than your threshold column
s = np.where(df.gt(df['t'],0), ['', 0, 1, 2, 3], np.nan)

# Convert to dataframe, find the first instance, fill the rest with zeros and make a new column
df['vals'] = pd.DataFrame(s).min(axis=1).fillna(0).astype(int).values

# Which yields your expected result
print(df)
#     t    0    1    2    3  vals
#JAN  3  1.9  2.1  2.6  2.9     0
#FEB  6  2.0  4.0  5.0  9.0     3
#MAR  2  1.0  3.0  4.0  4.0     1
#APR  4  1.5  3.0  6.0  2.0     2

Я на основе этого от ответа на аналогичную проблему здесь, который предложил, что этот метод быстрее, чем несколько других вариантов.

  • 0
    Извиняюсь за несоответствие между двумя таблицами ... Решение, которое вы предложили, работает отлично и быстро освещает :). Большое спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню