Как выбрать верхние N столбцов во фрейме данных с помощью критерия

#python #pandas

Вопрос:

Вот мой фрейм данных, он имеет высокую размерность (большое количество столбцов) более 10000 столбцов

Столбцы в моих данных разделены на 3 категории

столбцы начинаются с «Basic», столбцы заканчиваются на «_T» и все остальное

пример моего фрейма данных таков

 RowID   Basic1011 Basic2837 Lemon836 Car92_T Manf3953 Brat82 Basic383_T Jot112 ...
1       2         8         4        3       1        5      6          7
2       8         3         5        0       9        7      0          5
 

Я хочу, чтобы в моем фрейме данных были все столбцы «Basic» и «_T» и только ВЕРХНИЕ N (переменная может быть 3, 5, 10, 100 и т. Д.) Других столбцов

У меня есть этот код, чтобы дать мне верхний N для всех столбцов. но то, что я ищу, только верхние N столбцов не являются «базовыми» или «_T».

и под вершиной я подразумеваю величайшие ценности

 Top = 20
df = df.where(df.apply(lambda x: x.eq(x.nlargest(Top)), axis=1), 0)
 

Как я могу этого достичь?

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

1. Что вы подразумеваете под вершиной?

2. @DaniMesejo под вершиной я подразумеваю величайшие ценности

3. Как вы сравниваете столбец с другим столбцом?

4. @DaniMesejo по своей ценности

5. Столбец не больше (или меньше, чем другой столбец) какие критерии сортировки вы используете?

Ответ №1:

Попробуйте что-то подобное, возможно, вам придется сначала поиграть с выбором столбца, чтобы убедиться, что вы правильно фильтруете.

 # this gives you column names with Basic or _T anywhere in the column name.
unwanted = df.filter(regex='Basic|_T').columns.tolist()

# the tilda takes the opposite of the criteria, so no Basic or _T
dfn = df[df.columns[~df.columns.isin(unwanted)]]

#apply your filter
Top = 2
df_ranked = dfn.where(dfn.apply(lambda x: x.eq(x.nlargest(Top)), axis=1), 0)

#then merge dfn with df_ranked
 

Ответ №2:

Шаг 1: Вы можете использовать .filter() регулярное выражение для фильтрации столбцов со следующими 2 условиями:

  1. начните с «Базового», или
  2. заканчивайте на «_T».

Используемое регулярное выражение находится r'(?:^Basic)|(?:_T$)' там, где:

(?: ) является группой регулярных выражений без захвата. Это для временной группировки.

^ является ли начало текстового якоря для указания начальной позиции текста

Basic совпадает с текстом Basic (вместе с ^ , это Basic должно быть в начале метки столбца)

| является ли регулярное выражение метасимволом для or

_T соответствует тексту _T

$ является привязкой конца текста для указания позиции конца текста (вместе с _T _T$ указанием _T в конце имени столбца.

Мы называем эти столбцы как cols_Basic_T

Шаг 2: Затем используйте Index.difference() для поиска других столбцов. Мы называем эти другие столбцы как cols_others .

Шаг 3: Затем мы применяем аналогичный код, который вы использовали, чтобы указать верхний N для всех столбцов в этих выбранных столбцах col_others .

Полный набор кодов:

 ## Step 1
cols_Basic_T = df.filter(regex=r'(?:^Basic)|(?:_T$)').columns

## Step 2
cols_others = df.columns.difference(cols_Basic_T)

## Step 3
#Top = 20 
Top = 3     # use fewer columns here for smaller sample data here
df_others = df[cols_others].where(df[cols_others].apply(lambda x: x.eq(x.nlargest(Top)), axis=1), 0)
# To keep the original column sequence
df_others = df_others[df.columns.intersection(cols_others)]
 

Результаты:

cols_Basic_T

 print(cols_Basic_T)

Index(['Basic1011', 'Basic2837', 'Car92_T', 'Basic383_T'], dtype='object')
 

cols_others

 print(cols_others)

Index(['Brat82', 'Jot112', 'Lemon836', 'Manf3953', 'RowID'], dtype='object')
 

df_ другие

 print(df_others)

## With Top 3 shown as non-zeros. Other non-Top3 masked as zeros

   RowID  Lemon836  Manf3953  Brat82  Jot112
0      0         4         0       5       7
1      0         0         9       7       5