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






Расширенная индексация не требует списка списков фрагментов. Вместо этого вы можете использовать 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