Я считаю, что синтаксис предыдущих ответов является избыточным и трудно запоминаемым. Пандас представил метод query()
в v0.13, и я предпочитаю его. Для вашего вопроса вы можете сделать df.query('col == val')
Воспроизводится из http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query
In [167]: n = 10
In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))
In [169]: df
Out[169]:
a b c
0 0.687704 0.582314 0.281645
1 0.250846 0.610021 0.420121
2 0.624328 0.401816 0.932146
3 0.011763 0.022921 0.244186
4 0.590198 0.325680 0.890392
5 0.598892 0.296424 0.007312
6 0.634625 0.803069 0.123872
7 0.924168 0.325076 0.303746
8 0.116822 0.364564 0.454607
9 0.986142 0.751953 0.561512
# pure python
In [170]: df[(df.a < df.b) & (df.b < df.c)]
Out[170]:
a b c
3 0.011763 0.022921 0.244186
8 0.116822 0.364564 0.454607
# query
In [171]: df.query('(a < b) & (b < c)')
Out[171]:
a b c
3 0.011763 0.022921 0.244186
8 0.116822 0.364564 0.454607
Вы также можете получить доступ к переменным в среде, добавив @
.
exclude = ('red', 'orange')
df.query('color not in @exclude')
$myarray->[1]
означает «поиск индекса 1 в массиве, используя ссылку на массив, сохраненную в $myarray
».
$myarray[1]
означает «поиск индекса 1 в массиве @myarray
».
Две переменные $myarray
и @myarray
не имеют никакой связи вообще.
Первый и второй примеры являются функционально эквивалентными. Один - просто синтаксический сахар для другого.
Третий семантически отличается. В то время как допустимо опускать операторы ->
между индексами, это недопустимо делать между идентификаторами или вызовами и индексами подпрограмм, если переменная (или подпрограмма) содержит (или возвращает) ссылку, потому что Perl будет обрабатывать их как ссылки в этом случае.
Не существует ситуации, когда $array->[1][2]
могло бы означать что-либо, кроме $array->[1]->[2]
, но если бы было допустимо опустить стрелку между идентификатором и первым индексом, было бы неоднозначно относительно того, просматривается ли структура, индексируемая в как [1,...]
или (1,...)
, которые разные вещи.
Три точки
Все ссылки хранятся в скалярах, поэтому все ссылки хранятся в переменные, которые начинаются с $
.
[ ... ]
создает анонимную ссылку на массив, поэтому [ [1, 2, 3], [4, 5, 6], [7, 8, 9]]
создает анонимную ссылку на массив, содержащую 3 анонимные ссылки на массив, каждая из которых содержит 3 скаляра.
Это означает, что присвоение $ myarray присваивает ему ссылку на внешний анонимный массив.
Чтобы получить доступ к тому, на что указывает ссылка два, нужно разыменовать его. Вы можете сделать это, поместив символ для типа того, на что указывает ссылка, перед ссылкой, например @$myarray
. Таким образом, $myarray[0]
является первым элементом анонимного массива, содержащегося в ссылке $myarray
, или вы можете использовать косвенный синтаксис $myarray->[0]
.
В вашем примере $myarray->[0]
содержит ссылку на массив [1,2,3]
. Таким образом, на эту ссылку можно ссылаться таким же образом, давая $myarray->[0]->[0]
Это говорит о разыменовании $myarray
и дает мне первый элемент, который является ссылкой на массив, затем разыщите это и дайте мне первый элемент этого.
Это дает вам второй пример.
Perl позволяет вам опустить ->
между ]
и [
, а также }
и {
для анонимных хэшей, как синтаксический сахар. Это дает $myarray->[0][0]
, который является вашим первым примером.
Ваш третий пример ищет первый элемент из @myarray
, который отличается от переменной $myarray
. если бы вы поместили use strict
в начало вашего скрипта, Perl поймал бы эту ошибку за вас.
Хорошей идеей будет поместить
use strict;
use warnings;
в качестве первых двух строк любого скрипта или модуля Perl, поскольку они будут отлавливать множество плохих и потенциально фатальных ошибок в вашей Программе. Если вы отлаживаете программу, то добавление use diagnostics
в use strict
дает больше подробных сообщений.