#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 условиями:
- начните с «Базового», или
- заканчивайте на «_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