Использование iloc
с np.where
:
idx = next(iter(df['number'].iloc[np.where(df['color'].eq('blue'))]), -1) # 4
Обратите внимание, что это также обрабатывает случай, когда цвет не существует. Для сравнения df['color'].eq('orange').idxmax()
дает 0
, хотя 'orange'
не существует в ряду. Вышеуказанная логика даст -1
.
numba
Мне интересно, есть ли какой-либо более оптимальный подход, учитывая, что мне нужно только первое появление.
blockquote>Да! Более эффективное решение см. В . Эффективно вернуть индекс первого значения, удовлетворяющего условию в массиве . Numba позволяет эффективно выполнять итерацию по строкам. В этом случае вам нужно будет сначала разложить на множители строки , чтобы вы передавали числовые массивы только в Numba:
from numba import njit # factorize series, pd.factorize maintains order, # i.e. first item in values gives 0 index idx, values = pd.factorize(df['color']) idx_search = np.where(values == 'blue')[0][0] @njit def get_first_index_nb(A, k): for i in range(len(A)): if A[i] == k: return i return -1 res = df['number'].iat[get_first_index_nb(idx, 1)] # 4
Конечно, для одноразовых вычислений это неэффективно , Но для последовательных вычислений решение, скорее всего, будет фактором быстрее, чем решения, которые проверяют равенство по всей серии / массиву.
Конструктор может быть частным или защищен.
Также Вы не можете создать экземпляр абстрактного класса, даже если тот класс имеет общедоступного конструктора.
HttpContext имеет общедоступного конструктора с двумя перегрузками, но это не значение по умолчанию (никакие параметрические усилители) один.
Как пример, необходимо передать в экземпляре SimpleWorkerRequest, чтобы к instatiate экземпляр HttpContext и присваивает его HttpContext. Текущий:
//Initialize this stuff with some crap
string appVirtualDir = "/";
string appPhysicalDir = @"C:\Documents and Settings\";
string page = @"localhost";
string query = string.Empty;
TextWriter output = null;
//Create a SimpleWorkerRequest object passing down the crap
SimpleWorkerRequest workerRequest = new SimpleWorkerRequest(appVirtualDir, appPhysicalDir, page, query, output);
//Create your fake HttpContext instance
HttpContext.Current = new HttpContext(workerRequest);
См. эту ссылку для деталей.
Так или иначе некоторые классы не имеют общедоступных конструкторов - думают о singleton-классе, например, конструктор является частным (и можно назвать статический getInstance метод, чтобы получить текущий экземпляр или создать его, если это является пустым).
Удачи
Одиночные элементы, например, не имеют конструкторов, или по крайней мере, никаких общедоступных конструкторов. Таким образом, если Ваш класс является одиночным элементом вместо записи
MyClass c = new MyClass();
Вы записали бы вместо этого
MyClass c = MyClass.getInstance();
У Вас есть 3 вопроса там...
HttpContext; это на самом деле имеет двух общедоступных конструкторов - но в действительности Вы, как ожидают, не будете использовать их. В более общих чертах можно использовать конструкторов не по умолчанию как так: MyType foo = new MyType("abc");
.
Пропавший конструктор Довольно хорошо уже покрыл, но нет: abstract
/ static
являются самыми простыми, но также не необходимо иметь общедоступного конструктора.
ToBoolean Behing сцены, это сделает моральный эквивалент bool.Parse("Hello")
, который просто проверяет на известные строки - в особенности "Верный" и "Ложный" (использование OrdinalIgnoreCase, имея дело с пустым указателем/обрезкой/и т.д.).
Я полагаю, что конструктор HttpContext был отмечен частный. Это означает, что Вы не можете инстанцировать его сами. Платформа .NET создает один для Вас негласно...
Одним словом: статичный.
Иначе класс можно было бы инстанцировать внутренне или конфиденциально (Фабрика или Singleton)
Signleton:
Class A{
public static readonly A Instance = new A();
private A()
{
}
}
При создании конструктора частным Вы не можете extarnaly instatiate класс. Но в классе это возможно. Таким образом, можно обеспечить статический метод, который возвращает экземпляр класса. Шаблон "одиночка" основан на этом.