fn
буквально относится к jquery prototype
.
Эта строка кода находится в исходном коде:
jQuery.fn = jQuery.prototype = {
//list of functions available to the jQuery api
}
Но реальный инструмент позади fn
это его доступность для подключения ваших собственных функций в jQuery. Помните, что jquery будет родительской областью для вашей функции, поэтому this
будет ссылаться на объект jquery.
$.fn.myExtension = function(){
var currentjQueryObject = this;
//work with currentObject
return this;//you can include this if you would like to support chaining
};
Итак, вот простой пример этого. Предположим, что я хочу сделать два расширения, один из которых помещает синюю границу, и которая окрашивает текст синим цветом, и я хочу, чтобы они были прикованы.
jsFiddle Demo
$.fn.blueBorder = function(){
this.each(function(){
$(this).css("border","solid blue 2px");
});
return this;
};
$.fn.blueText = function(){
this.each(function(){
$(this).css("color","blue");
});
return this;
};
Теперь вы можете использовать их против класса следующим образом:
$('.blue').blueBorder().blueText();
(я знаю, что это лучше всего делать с css, например, с применением разных имен классов, но имейте в виду, что это просто демоверсия, чтобы показать концепцию).
Этот ответ имеет хороший пример полноценного расширения.
In [3]: df[df['ids'].str.contains("ball")]
Out[3]:
ids vals
0 aball 1
1 bball 2
3 fball 4
Если вы хотите установить столбец, на который вы фильтруете новый индекс, вы также можете использовать .filter
; если вы хотите сохранить его как отдельный столбец, тогда str.contains
- путь.
Допустим, у вас есть
df = pd.DataFrame({'vals': [1, 2, 3, 4, 5], 'ids': [u'aball', u'bball', u'cnut', u'fball', 'ballxyz']})
ids vals
0 aball 1
1 bball 2
2 cnut 3
3 fball 4
4 ballxyz 5
, и ваш план состоит в том, чтобы отфильтровать все строки в который ids
содержит ball
и устанавливает ids
в качестве нового индекса, вы можете сделать
df.set_index('ids').filter(like='ball', axis=0)
, который дает
vals
ids
aball 1
bball 2
fball 4
ballxyz 5
Но filter
также позволяет вам передайте регулярное выражение, чтобы вы могли также фильтровать только те строки, где запись столбца заканчивается на ball
. В этом случае вы используете
df.set_index('ids').filter(regex='ball$', axis=0)
vals
ids
aball 1
bball 2
fball 4
. Обратите внимание, что теперь запись с ballxyz
не включается, поскольку она начинается с ball
и не заканчивается им.
Если вы хотите получить все записи, начинающиеся с ball
, вы можете просто использовать
df.set_index('ids').filter(regex='^ball', axis=0)
, давая
vals
ids
ballxyz 5
То же самое работает с столбцами; все, что вам нужно изменить, это axis=0
. Если вы фильтруете на основе столбцов, это будет axis=1
.
df[df['ids'].str.contains('ball', na = False)] # valid for (at least) pandas version 0.17.1
Пошаговое объяснение (от внутреннего к внешнему):
df['ids']
выбирает столбец ids
кадра данных (в принципе, объект df[ids]
имеет тип pandas.Series
) df['ids'].str
позволяет применять векторизованные строковые методы (например, lower
, contains
) к серии df['ids'].str.contains('ball')
проверяет каждый элемент Серии относительно того, имеет ли значение элемента строку «шарик» в качестве подстроки. Результатом является серия булевых, указывающая True
или False
о существовании подстроки «шарик». df[df['ids'].str.contains('ball')]
применяет логическую «маску» к кадру данных и возвращает представление, содержащее соответствующие записи. na = False
удаляет значения NA / NaN из соображений; в противном случае может возвращаться ValueError. '#':str
примерно так?
– Sitz Blogz
28 June 2016 в 01:50
'ball'
на '|'.join(list_of_balls)
, вы можете применить список строк к поиску. В то время как '|'.join(list_of_balls)
создает RegEx с OR для поиска строк vaild
– venti
1 September 2017 в 08:38
>>> mask = df['ids'].str.contains('ball')
>>> mask
0 True
1 True
2 False
3 True
Name: ids, dtype: bool
>>> df[mask]
ids vals
0 aball 1
1 bball 2
3 fball 4
df[~df['ids'].str.contains("ball")]
,~
отрицает условие – Amit 1 March 2017 в 13:57