Как выполнить Excel MATCHINDEX или поисковые запросы в Python?

#python-3.x

#python-3.x

Вопрос:

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

Давайте предположим, что это фрейм данных df3, показанный ниже.

Мне нужно найти соответствующие значения строк типа для всех максимальных значений числовых столбцов.

например: max (price) => 8,85,113 => corr_logx (это выходные данные, которые мне нужно найти для всех числовых переменных)

 type         price           Bedroom_3  Bedroom_4
corr_x       3,56,315    5,01,687    6,05,458 
corr_logx    8,85,113    2,27,955    1,28,834 
corr_expx    8,34,503    3,62,952    2,30,759 
corr_sqrtx   6,29,162    3,36,964    8,96,593 
corr_sqrex   7,79,030    8,54,539    6,07,960 

Output I need:

Variable transfrm_used
Price     corr_logx
Bedroom_3 corr_sqrex
Bedroom_4 corr_sqrtx
  

Для этого:
Я создал список числовых имен столбцов и использовал его в качестве диапазона в for-loop. Это помогает мне переходить к каждому столбцу.

Затем внутри каждого столбца я создал еще один цикл for, который будет проходить в каждой строке, чтобы соответствовать максимальному значению столбца.

Если значение совпадает, то это должно привести к соответствующему значению из первого столбца / столбца 0 / типа имени столбца. В противном случае он должен продолжить поиск соответствия.

 cols_list = df3.columns.difference(['type'])
transfrm_used = []
variable = []

for col_name in cols_list:
    variable.append(col_name) # this gives the respective column name 
    print(variable)


    for rows in range(0,5):
        if df3[rows,col_name] == np.max(df3.col_name):  # works as Match
            transfrm_used.append(df3[rows,0])    
        else:
            continue

print('done')
  

Я ищу формат результата, в котором я могу получить оба названия столбцов, таких как price, Bedroom_3 и т.д., И его соответствующее значение из столбца типа, такого как corr_logx.

В Excel это делается с помощью MATCHINDEX и поисковых запросов. Вот полный набор фреймов данных и ожидаемый результат

 type        price       Bedroom_3   Bedroom_4
corr_x       3,56,315    5,01,687    6,05,458 
corr_logx    8,85,113    2,27,955    1,28,834 
corr_expx    8,34,503    3,62,952    2,30,759 
corr_sqrtx   6,29,162    3,36,964    8,96,593 
corr_sqrex   7,79,030    8,54,539    6,07,960 


            max_price   max_Bedroom_3   max_Bedroom_4
max_value:  8,85,113     8,54,539    8,96,593 


relevant_type: corr_logx    corr_sqrex  corr_sqrtx
  

Ответ №1:

Если вы уверены, что существует только один экземпляр каждой максимальной цены, чтобы найти максимальное значение столбца, подойдет .max() . Затем мы можем найти тип этой строки:

 max_value = {}
relevant_type = {}
for col_name in cols_list:
    max_val = df[col_name].max()
    max_value[col_name] = max_val
    relevant_type[col_name] = df.loc[df[col_name] == max_val,'type']
  

Затем мы можем добавить эти два dicts в виде строк в нижней части фрейма данных:

 df3.append(max_value, ignore_index=True)
df3.append(relevant_type, ignore_index=True)
  

Или мы можем создать новый фрейм данных:

 combined_dict = {x: [max_value[x],relevant_type[x]] for x in max_value}
df = pd.DataFrame(combined_dict, index=['max value','relevant type'])
  

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

1. Спасибо за решение и предоставление различных вариантов для него @Jim Eisenberg. Это работает отлично.

2. Рад помочь — если это соответствует тому, что вам нужно, пожалуйста, примите ответ 🙂

3. Я уже принял (нажал на верхнюю стрелку), но там не отображается никаких изменений в количестве. Дайте мне знать, если есть какой-либо другой способ сделать это. Я здесь новичок 🙂

4. Я тоже совсем новичок — но добро пожаловать в Stack Overflow 🙂 Стрелки вверх и вниз предназначены для увеличения и уменьшения голосов — я думаю, вам нужно определенное количество «баллов», чтобы сделать это. Под стрелками должен быть какой-то символ в виде звезды — нажатие на который принимает ответ. (Кстати, принятие ответов дает вам больше баллов, так что вы сможете повысить рейтинг).

5. Да, там была отметка, на которую я только что нажал, спасибо, что дали мне знать :))