Как найти номер столбца в питоне

Short Question: I can find the line number when a function called as in mentioned here

Similarly, how can I find column number?

Long Question:

def col():
  return something

print("result", col(), col(), col())

should return different numbers from each other, the same numbers whenever this print function is called.

How can I make this?

EDIT:

My workaround right now is as follows:

import inspect
def cid():
  f = inspect.currentframe().f_back
  caller_id = (f.f_lineno, f.f_lasti)
  return caller_id

print((cid(), cid(), cid(), cid(), cid()))
print((cid(), cid(), cid(), cid(), cid()))
print((cid(), cid(), cid(), cid(), cid()))
print((cid(), cid(), cid(), cid(), cid()))

print((cid(),
        cid(),
        cid(),
        cid(),
        cid()))

works as expected (for now). This prints:

((8, 30), (8, 36), (8, 42), (8, 48), (8, 54))
((9, 65), (9, 71), (9, 77), (9, 83), (9, 89))
((10, 100), (10, 106), (10, 112), (10, 118), (10, 124))
((11, 135), (11, 141), (11, 147), (11, 153), (11, 159))
((13, 170), (14, 176), (15, 182), (16, 188), (17, 194))

Problem: I don’t know what f_lasti brings exactly at a moment.

#python #python-3.x

#python #python-3.x

Вопрос:

Я хочу найти номер столбца столбцов с одним значением: вот мой фрейм данных:

 Cow_ID,Collar_label,BCS,Age_weeks,Height_cm,Weight_kg
cow1,aq5t,90,14,90,120
cow2,aq4r,92,14,92,118
cow3,aq2f,87,14,87,120
cow4,aq7u,81,14,81,118
cow5,aq9p,93,14,93,120
cow6,aq4m,89,14,89,120
cow7,aq1v,86,14,86,118
cow8,aq2c,92,14,92,120
cow9,aq5t,89,14,89,120
cow10,aq5x,88,14,88,118
 

и вот мой код, с помощью которого я могу получить имя столбца с одним значением:

 df = read_csv(filename, header=0)
print("Data frame size: ", df.shape)
print("Data frame : ", df)

# get the number of unique values for each column
counts = df.nunique()


print("number of unique values within each column:")
print(counts)
 

print("column with single value: ", counts[counts ==1])
 

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

Ответ №1:

Получить индекс ряда с одиночными значениями:

 counts[counts ==1].index[0]
>> 'Age_weeks'
 

Условное выражение дает список True/False совпадений с номерами столбцов:

 df.columns == 'Age_weeks'
>> array([False, False, False,  True, False, False])
 

И используйте np.where , чтобы получить индекс True элемента, который равен номеру вашего столбца:

 np.where(df.columns == counts[counts ==1].index[0])
>>(array([3]),)
 

Чтобы получить число:

 np.where(df.columns == counts[counts ==1].index[0])[0][0]
>> 3
 

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

1. Спасибо, не могли бы вы объяснить мне, как работает этот код: np.where(df.columns == counts[counts ==1].index[0])[0][0]. Я новичок и в процессе обучения

2. Так counts[counts ==1] из кода вопроса, возвращает pandas. Серия с одной строкой, потому что в серии «counts» есть только один элемент со значением 1. (кстати, если вы хотите обрабатывать несколько элементов, вам нужно выполнить итерацию здесь.) .index[0] возвращает имя этой строки. df.columns содержит все имена столбцов df, поэтому == дает логический список, соответствующий столбцам. Наконец, np.where возвращает индекс True , который на самом деле является номером столбца df.

3. Это из-за типа np.where возвращаемого вывода. Он возвращает кортеж из двух массивов numpy, каждый массив содержит индексы измерения. В нашем случае массив boolean представляет собой одно измерение. Итак, мы получаем кортеж из «numpy array» и «empty» : (array([3]),) . Первый [0] выбирает первый элемент кортежа, а второй [0] выбирает число внутри массива numpy.

4. @Manakin это не дает номер столбца, он просто показывает содержимое столбца. Можете ли вы исправить это, пожалуйста? Я хочу попробовать ваш код

Ответ №2:

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

 enum = dict(enumerate(df.columns))

column_nums = {v : k for k,v in enum.items() if v in counts[counts ==1].index}

{'Age_weeks': 3}
 

 print(enum)

{0: 'Cow_ID',
 1: 'Collar_label',
 2: 'BCS',
 3: 'Age_weeks',
 4: 'Height_cm',
 5: 'Weight_kg'}
 

Матрица — это двумерный массив, состоящий из M строк и N столбцов. Матрицы часто используются в математических вычислениях. Программисты работают с матрицами в основном в научной области, однако их можно использовать и для других вещей, например, для быстрой генерации уровней в видео-игре.

Матрицы и библиотека NumPy

Программист может самостоятельно реализовать все функции для работы с матрицами: умножение, сложение, транспонирование и т. д. На Python это сделать гораздо проще, чем на более низкоуровневых языках, таких как C.

Но каждый раз писать одни и те же алгоритмы не имеет смысла, поэтому была разработана библиотека NumPy. Она используется для сложных научных вычислений и предоставляет программисту функции для работы с двумерными массивами.

Вместо того чтобы писать десятки строк кода для выполнения простых операций над матрицами, программист может использовать одну функцию из NumPy. Библиотека написана на Python, C и Фортране, поэтому функции работают даже быстрее, чем на чистом Python.

Подключение библиотеки NumPy

NumPy не встроена в интерпретатор Python, поэтому перед импортом её необходимо установить. Для этого в можно воспользоваться утилитой pip. Введите в консоле команду:

pip install numpy

Теперь, когда библиотека установлена, её можно подключить с помощью команды import. Для удобства переименуем numpy при импорте в np следующим образом:

import numpy as np

Ниже в примерах будет использован именно такой импорт, поэтому обращение к библиотеке будет через np, а не numpy!

Создание

Для создании матрицы используется функция array(). В функцию передаётся список. Вот пример создания, мы подаём в качестве аргумента функции двумерный список:

a = np.array([[3, 3, 3], [2, 5, 5]])

Вторым параметром можно задать тип элементов матрицы:

a = np.array([[3, 3, 3],[2, 5, 5]], int)
print(a)

Тогда в консоль выведется:

[[3 3 3]
 [2 5 5]]

Обратите внимание, что если изменить int на str, то тип элементов изменился на строковый. Кроме того, при выводе в консоль NumPy автоматически отформатировал вывод, чтобы он выглядел как матрица, а элементы располагались друг под другом.

В качестве типов элементов можно использовать int, float, bool, complex, bytes, str, buffers. Также можно использовать и другие типы NumPy: логические, целочисленные, беззнаковые целочисленные, вещественные, комплексные. Вот несколько примеров:

  • np.bool8 — логическая переменная, которая занимает 1 байт памяти.
  • np.int64 — целое число, занимающее 8 байт.
  • np.uint16 — беззнаковое целое число, занимающее 2 байта в памяти.
  • np.float32 — вещественное число, занимающее 4 байта в памяти.
  • np.complex64 — комплексное число, состоящее из 4 байтового вещественного числа действительной части и 4 байтов мнимой.

Вы также можете узнать размер матрицы, для этого используйте атрибут shape:

size = a.shape
print(size) # Выведет (2, 3)

Первое число (2) — количество строк, второе число (3) — количество столбцов.

Нулевая матрица

Если необходимо создать матрицу, состоящую только из нулей, используйте функцию zeros():

a_of_zeros = np.zeros((2,2))
print(a_of_zeros)

Результат этого кода будет следующий:

[[0. 0.]
 [0. 0.]]

Получение строки, столбца и элемента

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

temp = a[0]
print(temp) #Выведет [3 3 3]

Получить столбец уже не так просто. Используем срезы, в качестве первого элемента среза мы ничего не указываем, а второй элемент — это номер искомого столбца. Пример:

arr = np.array([[3,3,3],[2,5,5]], str)
temp = arr[:,2]
print(temp) # Выведет ['3' '5']

Чтобы получить элемент, нужно указать номер столбца и строки, в которых он находится. Например, элемент во 2 строке и 3 столбце — это 5, проверяем (помним, что нумерация начинается с 0):

arr = np.array([[3,3,3],[2,5,5]], str)
temp = arr[1][2]
print(temp) # Выведет 5

Умножение и сложение

Чтобы сложить матрицы, нужно сложить все их соответствующие элементы. В Python для их сложения используется обычный оператор «+».

Пример сложения:

arr1 = np.array([[3,3,3],[2,5,5]])
arr2 = np.array([[2,4,2],[1,3,8]])
temp = arr1 + arr2
print(temp)

Результирующая матрица будет равна:

[[ 5  7  5]
 [ 3  8 13]]

Важно помнить, что складывать можно только матрицы с одинаковым количеством строк и столбцов, иначе программа на Python завершится с исключением ValueError.

Умножение матриц сильно отличается от сложения. Не получится просто перемножить соответствующие элементы двух матриц. Во-первых, матрицы должны быть согласованными, то есть количество столбцов одной должно быть равно количеству строк другой и наоборот, иначе программа вызовет ошибку.

Умножение в NumPy выполняется с помощью метода dot().

Пример умножения:

arr1 = np.array([[3,3],[2,5]])
arr2 = np.array([[2,4],[1,3]])
temp = arr1.dot(arr2)
print(temp)

Результат выполнения этого кода будет следующий:

[[ 9 21]
 [ 9 23]]

Как она получилась? Разберём число 21, его позиция это 1 строка и 2 столбец, тогда мы берем 1 строку первой матрицы и умножаем на 2 столбец второй. Причём элементы умножаются позиционно, то есть 1 на 1 и 2 на 2, а результаты складываются: [3,3] * [4,3] = 3 * 4 + 3 * 3 = 21.

Транспонированная и обратная

Транспонированная матрица — это матрица, у которой строки и столбцы поменялись местами. В библиотеки NumPy для транспонирования двумерных матриц используется метод transpose(). Пример:

arr1 = np.array([[3,3],[2,5]])
temp = arr1.transpose()
print(temp)

В результате получится матрица:

[[3 2]
 [3 5]]

Чтобы получить обратную матрицу, необходимо использовать модуль linalg (линейная алгебра). Используем функцию inv():

arr1 = np.array([[3,3],[2,5]])
temp = np.linalg.inv(arr1)
print(temp)

Результирующая матрица будет равна:

[[ 0.55555556 -0.33333333]
 [-0.22222222  0.33333333]]

Получение максимального и минимального элемента

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

arr = np.array([[3,3],[2,5]])
min = arr[0][0]
for i in range(arr.shape[0]):
    for j in range(arr.shape[1]):
        if min > arr[i][j]:
            min = arr[i][j]
print("Минимальный элемент:", min) # Выведет "Минимальный элемент: 2"

NumPy позволяет найти максимальный и минимальный элемент с помощью функций amax() и amin(). В качестве аргумента в функции нужно передать саму матрицу. Пример:

arr1 = np.array([[3,3],[2,5]])
min = np.amin(arr1)
max = np.amax(arr1)
print("Минимальный элемент:", min) # Выведет "Минимальный элемент: 2"
print("Максимальный элемент:", max) # Выведет "Максимальный элемент: 5"

Как видим, результаты реализации на чистом Python и реализации с использованием библиотеки NumPy совпадают.

Заключение

На Python можно реализовать все необходимые функции для работы с матрицами. Чтобы упростить работу программистов, была создана библиотека NumPy. Она позволяет производить сложные математические вычисления легко и без ошибок, избавляя программиста от необходимости каждый раз писать один и тот же код.

5 ответов

Конечно, вы можете использовать .get_loc():

In [45]: df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

In [46]: df.columns
Out[46]: Index([apple, orange, pear], dtype=object)

In [47]: df.columns.get_loc("pear")
Out[47]: 2

хотя, честно говоря, я не часто нуждаюсь в этом сам. Обычно доступ по имени делает то, что я хочу (df["pear"], df[["apple", "orange"]], или, возможно, df.columns.isin(["orange", "pear"])), хотя я могу определенно видеть случаи, когда вам нужен номер индекса.

DSM
23 окт. 2012, в 00:40

Поделиться

Вот решение через понимание списка. cols — список столбцов, для которых нужно получить индекс:

[df.columns.get_loc(c) for c in cols if c in df]

snovik
09 сен. 2017, в 09:53

Поделиться

Решение DSM работает, но если вы хотите получить прямой эквивалент which, вы можете сделать (df.columns == name).nonzero()

Wes McKinney
23 окт. 2012, в 19:43

Поделиться

Если вам нужно имя столбца из местоположения столбца (наоборот, к вопросу OP), вы можете использовать:

>>> df.columns.get_values()[location]

Используя пример @DSM:

>>> df = DataFrame({"pear": [1,2,3], "apple": [2,3,4], "orange": [3,4,5]})

>>> df.columns

Index(['apple', 'orange', 'pear'], dtype='object')

>>> df.columns.get_values()[1]

'orange'

По-другому:

df.iloc[:,1].name

salhin
02 март 2018, в 12:19

Поделиться

Если вы захотите найти несколько совпадений столбцов, можно использовать векторизованное решение с использованием метода searchsorted. Таким образом, при df в качестве фрейма данных и query_cols в качестве имен столбцов, которые нужно искать, реализация будет —

def column_index(df, query_cols):
    cols = df.columns.values
    sidx = np.argsort(cols)
    return sidx[np.searchsorted(cols,query_cols,sorter=sidx)]

Пример прогона —

In [162]: df
Out[162]: 
   apple  banana  pear  orange  peach
0      8       3     4       4      2
1      4       4     3       0      1
2      1       2     6       8      1

In [163]: column_index(df, ['peach', 'banana', 'apple'])
Out[163]: array([4, 1, 0])

Divakar
20 июль 2016, в 20:21

Поделиться

Ещё вопросы

  • 1Получить уровень «подписи» на Android
  • 0Откройте div и закройте других
  • 0как вызвать на jquery.smart мастере кнопку Готово?
  • 1Python. Создание списка объединенных объектов на основе одного или нескольких атрибутов
  • 0Как проверить ввод в динамической таблице HTML?
  • 1Типы предупреждений в Python и MATLAB
  • 0Оператор PHP IF возвращает истинное значение только один раз в цикле while
  • 1Как я могу изменить изображение профиля при нажатии на существующее изображение в angularjs?
  • 0заменить звездочку innerhtml javascript
  • 0Сортировка списка с помощью jquery UI
  • 1Chrome как отключить ключевое слово отладчика или отключить паузу
  • 1Ошибка установки pip с проверкой сертификата SSL (_ssl.c: 833)
  • 0Как эффективно вставить элементы в карту?
  • 1Как вы делаете предупреждение с закругленными углами, используя Anko без использования XML?
  • 1Странный артефакт при обновлении заголовка Pivot в Windows Phone 8
  • 1ASP.Net MVC длительный процесс
  • 1Выкладывание JTextField как JLabel, который можно обернуть — нежелательное поведение
  • 0Зависание обоих элементов гнезда
  • 0Удалить свойство css, используя angular или javascript
  • 1Передача объектов из стека в стек неправильно копируется
  • 1WTForms: передача другого контейнера в валидатор
  • 1Ошибка после установки адаптера allure pytest
  • 0$ index перезапустить каждую строку в ng-repeat
  • 1Отметить событие как явно НЕ пассивное
  • 0Присоединение узла к LinkedList
  • 1Отправить электронную почту через Python с помощью Outlook 2016, не открывая его
  • 1сериализация и десериализация объектов из разных мест
  • 0API для запроса REST от NodeJS к бэкэнду
  • 1Infragistics Ultragrid — низкая производительность с помощью PerformAutoResize
  • 0Как получить роль пользователя с помощью Zend framework2?
  • 1Кажется, Virtualenv не может найти Flask «Не удалось найти версию, которая удовлетворяет требованию»
  • 1Пользовательские элементы управления ASP.Net совместно используются несколькими проектами
  • 1Внутри класса доступ к значениям словаря в одной функции из другой
  • 0Объедините флажок jquery mobile в виде списка вместе со значком данных
  • 0автоматическое закрытие начальной загрузки
  • 0Как центрировать <div>, не затрагивая содержимое внутри?
  • 0Убедитесь, что флажки установлены на странице перезагрузки JQuery
  • 0pouchdb не определяется в приложении angularjs
  • 0MySQL регулярное выражение для сопоставления путей
  • 0CSS, Div перекрываются, несмотря на поля
  • 1Как добавить разделитель в нижней части навигации
  • 0Назначение переменных после разбора файла с помощью c ++
  • 0В чем заключается ошибка «правила синтаксического анализатора« каналы », запрещенные в лексере» в этом файле ANTLR 4 Lexer?
  • 0выберите для обновления дважды к той же таблице ключом diffrenet, вызывающим взаимоблокировку в MySQL
  • 0Редактирование ячейки JqGrid с использованием редактирования ячейки
  • 0Вызов функции шаблона через макрос для строкового параметра?
  • 0Загрузка изображений напрямую с сервера
  • 0Открыть мобильную клавиатуру на определенном языке из HTML
  • 1Получить все div под div с известным идентификатором и перебрать его
  • 1Шаблон посетителя, почему это полезно?

Есть матрица:

a = [[1, 2, 3, 4, 5, 6, 7, 8],
     [1, 2, 3, 4, 5, 6, 7, 8],
     [1, 2, 3, 4, 5, 6, 7, 8],
     [1, 2, 3, 4, 5, 6, 7, 8],
     [1, 2, 3, 4, 5, 6, 7, 8],
     [1, 2, 3, 4, 5, 6, 7, 8],
     [1, 2, 3, 4, 5, 6, 7, 8],
     [1, 2, 3, 4, 5, 6, 7, 8]]

Мне нужно получить столбец этой матрицы.
Подскажите, почему a[:][0] выдает

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

а не

[1, 1, 1, 1, 1, 1, 1, 1]

?

Понравилась статья? Поделить с друзьями:
  • Как составить свой тест для друзей
  • Как найти отрезок соединяющий середины сторон четырехугольника
  • Как составить kpi для бизнес процесса
  • Как исправить севшую шерстяную кофту
  • Как найти файл который не отображается