Выбор диапазона столбцов в Python

У меня есть набор данных, который состоит из столбцов от 0 до 10, и я хочу извлечь информацию, которая находится только в столбцах с 1 по 5, а не с 6, и с 7 по 9 (это означает, что не последний). Пока что я сделал следующее:

 A=B[:,[[1:5],[7:-1]]]

но у меня синтаксическая ошибка, как мне получить эти данные?

Спасибо

Почему в 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
1 327
5

Ответы 5

Расширенная индексация не требует списка списков фрагментов. Вместо этого вы можете использовать numpy.r_. Эта функция не принимает отрицательные индексы, но вы можете обойти это, используя np.ndarray.shape:

A = B[:, np.r_[1:6, 7:B.shape[1]-1]]

Не забудьте добавить 1 ко второй части, поскольку a: b не включает b, точно так же, как slice(a, b) не включает b. Также обратите внимание, что индексирование начинается с 0.

Вот демонстрация:

import numpy as np

B = np.random.randint(0, 10, (3, 11))

print(B)

[[5 8 8 8 3 0 7 2 1 6 7]
 [4 3 8 7 3 7 5 6 0 5 7]
 [1 0 4 0 2 2 5 1 4 2 3]]

A = B[:,np.r_[1:6, 7:B.shape[1]-1]]

print(A)

[[8 8 8 3 0 2 1 6]
 [3 8 7 3 7 6 0 5]
 [0 4 0 2 2 1 4 2]]

Другой способ - получить ваши фрагменты независимо, а затем объединить их:

A = np.concatenate([B[:, 1:6], B[:, 7:-1]], axis=1)

Используя аналогичные примерные данные, как @jpp:

B = np.random.randint(0, 10, (3, 10))

>>> B
array([[0, 5, 0, 6, 8, 5, 9, 3, 2, 0],
       [8, 8, 1, 7, 3, 5, 7, 7, 4, 8],
       [5, 5, 5, 2, 3, 1, 6, 4, 9, 6]])

A = np.concatenate([B[:, 1:6], B[:, 7:-1]], axis=1)

>>> A
array([[5, 0, 6, 8, 5, 3, 2],
       [8, 1, 7, 3, 5, 7, 4],
       [5, 5, 2, 3, 1, 4, 9]])

как насчет объединения диапазона?

B[:, np.union1d(range(1,6), range(7,10))]

Просто чтобы добавить несколько своих мыслей. Есть два подхода, которые можно использовать с помощью numpy или pandas. Итак, я продемонстрирую некоторые данные и предположу, что эти данные представляют собой оценки студента на разных курсах, на которые он / она записан.

import pandas as pd
import numpy as np

data = {'Course A': [84, 82, 81, 89, 73, 94, 92, 70, 88, 95],
        'Course B': [85, 82, 72, 77, 75, 89, 95, 84, 77, 94],
        'Course C': [97, 94, 93, 95, 88, 82, 78, 84, 69, 78],
        'Course D': [84, 82, 81, 89, 73, 94, 92, 70, 88, 95],
        'Course E': [85, 82, 72, 77, 75, 89, 95, 84, 77, 94],
        'Course F': [97, 94, 93, 95, 88, 82, 78, 84, 69, 78]
        }

df = pd.DataFrame(data=data)
df.head()


    CA  CB  CC  CD  CE  CF
0   84  85  97  84  85  97
1   82  82  94  82  82  94
2   81  72  93  81  72  93
3   89  77  95  89  77  95
4   73  75  88  73  75  88

ПРИМЕЧАНИЕ:CA - CF представляют собой Course A - Course F.

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

map_cols = [f"{c[0]}:{c[1]}" for c in enumerate(df.columns)]

['0:Course A',
 '1:Course B',
 '2:Course C',
 '3:Course D',
 '4:Course E',
 '5:Course F']

Теперь, чтобы выбрать, скажем, Course A и Course D - Course F с использованием индексации в numpy, вы можете сделать следующее:

df.iloc[:, np.r_[0, 3:df.shape[1]]]

    CA  CD  CE  CF
0   84  84  85  97
1   82  82  82  94
2   81  81  72  93
3   89  89  77  95
4   73  73  75  88

Вы также можете использовать панды для того же эффекта.

df[[df.columns[0], *df.columns[3:]]]

    CA  CD  CE  CF
0   84  84  85  97
1   82  82  82  94
2   81  81  72  93
3   89  89  77  95
4   73  73  75  88

Это можно решить с помощью суммы range

[In]: columns = list(range(1,6)) + list(range(7,10))
[Out]: 
[1, 2, 3, 4, 5, 7, 8, 9]

Затем, учитывая, что ваш df называется df, используя iloc для выбора столбцов DF

newdf = df.iloc[:, columns]

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