Вы можете использовать pd.concat
с groupby
и использовать пользовательскую функцию для заполнения логики:
# convert to numeric
df['Number'] = pd.to_numeric(df['Number'])
# assign values by index
def filler(x):
idx = np.where(x['Number'].notnull())[0]
x.iloc[:idx[0], -2:] = ['1. Too Low', 1]
x.iloc[idx[-1]+1:, -2:] = ['3. Too High', 3]
return x
# concatenate transformed dataframe slices
res = pd.concat(df_slice.pipe(filler) for _, df_slice in df.groupby('Department'))
Результат:
print(res)
Department Range Rating Number
0 Admin 0 (None) 1. Too Low 1.0
1 Admin 01 to 3 1. Too Low 1.0
2 Admin 01 to 3 1. Too Low 1.0
3 Admin 01 to 3 1. Too Low 1.0
4 Admin 04 to 6 2. On Target 2.0
5 Admin 04 to 6 2. On Target 2.0
6 Admin 04 to 6 2. On Target 2.0
7 Admin 07 to 10 3. Too High 3.0
8 Admin 07 to 10 3. Too High 3.0
9 Admin 07 to 10 3. Too High 3.0
10 Admin 07 to 10 3. Too High 3.0
11 Distribution 0 (None) 1. Too Low 1.0
12 Distribution 01 to 3 1. Too Low 1.0
13 Distribution 01 to 3 1. Too Low 1.0
14 Distribution 01 to 3 1. Too Low 1.0
15 Distribution 04 to 6 2. On Target 2.0
16 Distribution 04 to 6 2. On Target 2.0
17 Distribution 04 to 6 2. On Target 2.0
18 Distribution 07 to 10 3. Too High 3.0
19 Distribution 07 to 10 3. Too High 3.0
20 Distribution 07 to 10 3. Too High 3.0
21 Distribution 07 to 10 3. Too High 3.0
Я обычно делаю это как это:
try {
// Use the resource.
} catch( Exception ex ) {
// Problem with the resource.
} finally {
// Put away the resource.
closeQuietly( resource );
}
В другом месте:
protected void closeQuietly( Resource resource ) {
try {
if (resource != null) {
resource.close();
}
} catch( Exception ex ) {
log( "Exception during Resource.close()", ex );
}
}
try {
final Resource resource = acquire();
try {
use(resource);
} finally {
resource.release();
}
} catch (ResourceException exx) {
... sensible code ...
}
сделанный Job. Никакие пустые тесты. Единственная выгода, включайте, получают и выпускают исключения. Конечно, можно использовать Выполнение Вокруг идиомы и только иметь для записи этого однажды для каждого типа ресурса.
Я обычно делаю это:
MyResource r = null;
try {
// use resource
} finally {
if( r != null ) try {
r.close();
} catch( ThatSpecificExceptionOnClose teoc ){}
}
Объяснение: Если я сделан с ресурсом и единственной проблемой, я имею, закрывает его, нет очень, я могу делать с этим. Не имеет смысла ни один уничтожать целый поток, если я сделан с ресурсом так или иначе.
Это - один из случаев, когда, по крайней мере, для меня, безопасно проигнорировать ту контролируемую исключительную ситуацию.
По сей день у меня не было проблемы с помощью этой идиомы.
Вы могли осуществить рефакторинг это в другой метод...
public void RealDoSuff()
{
try
{ DoStuff(); }
catch
{ // resource.close failed or something really weird is going on
// like an OutOfMemoryException
}
}
private void DoStuff()
{
try
{}
catch
{
}
finally
{
if (resource != null)
{
resource.close();
}
}
}
Если Вы можете, необходимо протестировать для предотвращения состояния ошибки для начала.
try{...}
catch(NullArgumentException nae){...}
finally
{
//or if resource had some useful function that tells you its open use that
if (resource != null)
{
resource.Close();
resource = null;//just to be explicit about it was closed
}
}
Также необходимо, вероятно, только ловить исключения, с которых можно восстановиться, если Вы не можете восстановиться, затем позволяют ему распространить к верхнему уровню Вашей программы. Если Вы не можете протестировать на состояние ошибки, что необходимо будет окружить код блоком выгоды попытки как Вы, уже сделали (хотя я рекомендовал бы все еще ловить определенные, ожидаемые погрешности).
Почему Вы хотите избежать дополнительного блока? Начиная с наконец блок содержит "нормальные" операции, которые могут выдать исключение, И Вы хотите наконец блок работать полностью, необходимо поймать исключения.
, Если Вы не ожидаете наконец блок выдавать исключение и Вы не знаете, как обработать исключение так или иначе (Вы просто вывели бы отслеживание стека), позволяют пузырю исключения стек вызовов (удалите выгоду попытки из наконец блок).
, Если Вы хотите уменьшить ввод Вас, мог бы реализовать "глобальный" внешний блок try-catch, который поймает все исключения, добавленные наконец блоки:
try {
try {
...
} catch (Exception ex) {
...
} finally {
...
}
try {
...
} catch (Exception ex) {
...
} finally {
...
}
try {
...
} catch (Exception ex) {
...
} finally {
...
}
} catch (Exception ex) {
...
}
Я обычно использую один из эти closeQuietly
методы в org.apache.commons.io.IOUtils
:
public static void closeQuietly(OutputStream output) {
try {
if (output != null) {
output.close();
}
} catch (IOException ioe) {
// ignore
}
}
Одно решение, если этими двумя Исключениями являются два различных класса
try {
...
}
catch(package1.Exception err)
{
...
}
catch(package2.Exception err)
{
...
}
finally
{
}
, Но иногда Вы не можете избежать этой второй выгоды попытки. например, для закрытия потока
InputStream in=null;
try
{
in= new FileInputStream("File.txt");
(..)// do something that might throw an exception during the analysis of the file, e.g. a SQL error
}
catch(SQLException err)
{
//handle exception
}
finally
{
//at the end, we close the file
if(in!=null) try { in.close();} catch(IOException err) { /* ignore */ }
}