Если вы просто хотите, чтобы строки нарушали это условие, используйте groupby
и проверьте с помощью nunique
:
df[df.groupby('COL1').COL2.transform('nunique') > 1]
Или с groupby
, nunique
и map
:
df[df.COL1.map(df.groupby('COL1').COL2.nunique()) > 1]
COL1 COL2
1 B 2
2 B 2
3 B 3
Если вы хотите отобразить значение COL1 на значения COL2, вы можете использовать дополнительные groupby
и apply
:
df[df.groupby('COL1').COL2.transform('nunique') > 1].groupby('COL1').COL2.apply(set)
COL1
B {2, 3}
Name: COL2, dtype: object
И, наконец, если все, что вам нужно, это «количество элементов» для> 1 значений COL1, используйте
df.groupby('COL1').COL2.nunique().to_frame().query('COL2 > 1')
COL2
COL1
B 2
Поскольку Вы подразумевали, изменение (и другие события) только стреляют, когда пользователь принимает некоторые меры. Сценарий, изменяющий вещи, не запустит событий. Ваше единственное решение состоит в том, чтобы найти некоторый рычаг в управление, которое можно сцепить до слушателя.
Вот то, как я сделал бы это:
basicDatePicker.selectDate = basicDatePicker.selectDate.wrap(function(orig,year,month,day,hide) {
myListener(year,month,day);
return orig(year,month,day,hide);
});
Это основано на поверхностном взгляде с Firebug (я не знаком с компонентом). Если будут другие способы выбрать дату, то необходимо будет перенести те методы также.
Кроме того, чтобы обходить проблему как то, как Ноа объяснил, Вы могли также просто создать таймер, который проверяет значение каждая несколько сотен миллисекунд.
IE имеет onpropertychange событие, которое могло использоваться с этой целью.
Для реальных веб-браузеров (;)), существует событие мутации DOMAttrModified, но через несколько минут ценность экспериментирования в Firefox, я не смог заставить его стрелять во ввод текста, когда значение будет изменено программно (или входом обычной клавиатуры), все же оно будет стрелять, если я изменю имя входа программно. Curiouser и curiouser...
Если Вы не можете получить ту работу надежно, Вы могли бы всегда просто регулярно опрашивать значение входа:
var value = someInput.value;
setInterval(function()
{
if (someInput.value != value)
{
alert("Changed from " + value + " to " + someInput.value);
value = someInput.value;
}
}, 250);
В зависимости от того, как был записан внешний JavaScript, Вы могли всегда переписывать соответствующие части внешнего сценария в Вашем сценарии и иметь его, перезаписывают внешнее определение так, чтобы событие изменения было инициировано.
Я должен был сделать это прежде со сценариями, которые находились вне моего контроля.
Просто необходимо найти внешнюю функцию, скопировать ее в целом как новую функцию с тем же именем и переписать сценарий, чтобы сделать то, к чему Вы хотите ее.
Конечно, если сценарий был записан правильно с помощью закрытий, Вы не сможете изменить его слишком легко...
Я должен был изменить поддающееся датировке управление paginator YUI, однажды таким образом рекомендуемое Dan. Это - грубая сила, но это работало в решении моей проблемы. Таким образом, найдите метод, пишущий в поле, скопируйте его код и добавьте, что оператор, запускающий событие изменения и в Вашем коде просто, обрабатывает то событие изменения. Просто необходимо переопределить исходную функцию с той новой версией его. Опрос, в то время как хорошо работать кажется мне намного большим решением для потребления ресурса.
addEventListener ("DOMControlValueChanged" будет стрелять, когда значение управления изменится, даже если это сценарием.
addEventListener ("вход" является direct-user-initiated, фильтровал версию DOMControlValueChanged.
К сожалению, DOMControlValueChanged только в настоящее время поддерживается Opera, и входная поддержка мероприятия повреждается в WebKit. Входное событие также имеет различные ошибки в Firefox и Opera.
Этот материал будет, вероятно, разрешен в HTML5 довольно скоро, fwiw.
Обновление:
С 08.09.2012 поддержка DOMControlValueChanged была отброшена из Opera (потому что это было удалено из HTML5), и 'входная' поддержка мероприятия намного лучше в браузерах (включая меньшее количество ошибок) теперь.