Давайте попробуем это:
smax = lambda x: x[x.rank(ascending = False) == 2]
smax.__name__ = 'secondMax'
tmax = lambda x: x[x.rank(ascending = False) == 3]
tmax.__name__ = 'thirdMax'
df_out = df.groupby(['id1','id2']).agg(['max','min',smax, tmax])
df_out.columns = [f'{i}_{j}' for i,j in df_out.columns]
df_out = df.merge(df_out, on=['id1','id2'])
df_out = df_out.where(df_out.astype(bool))
df_out
Вывод:
id1 id2 c1 c2 c1_max c1_min c1_secondMax c1_thirdMax c2_max c2_min c2_secondMax c2_thirdMax
0 1 a1 5 3 34 5 9 6 32 2 4 3
1 1 a1 6 2 34 5 9 6 32 2 4 3
2 1 a1 9 4 34 5 9 6 32 2 4 3
3 1 a1 34 32 34 5 9 6 32 2 4 3
4 2 b1 5 2 23 5 5 NaN 43 2 2 NaN
5 2 b1 23 43 23 5 5 NaN 43 2 2 NaN
6 3 3a 234 435 234 234 NaN NaN 435 435 NaN NaN
Когда Вы пишете свои ссылки, необходимо всегда включать заключительную наклонную черту. Я не знаю, относится ли это к mvc платформе (или URL, Направляющий в целом), но я знаю, что для статических ресурсов, если Вы не помещаете наклонную черту в Вас, добавляют небольшие издержки, поскольку запрос сделан дважды.
Наклонная черта сразу идентифицирует URL как указывающий на каталог. Никакая потребность проанализировать файлы.
Снова, я не полагаю, что это применяется, когда Вы используете маршрутизацию URL, но я не изучил ее.
Проверьте ЗДЕСЬ на статью о запаздывающей наклонной черте
править: После размышления об этом... Я думаю, что, вероятно, лучше бросить наклонную черту, вместо того, чтобы пытаться включать его. При использовании маршрутизации URL Вы используете URL для маршрутизации непосредственно к ресурсу. В противоположность тому, чтобы указывать на каталог с index.html или default.aspx, Вы указываете на определенный файл.
Я знаю, что различие является тонким, но может быть лучше придерживаться ненаклонной черты для Направленных URL, вместо того, чтобы бороться с платформой.
Используйте запаздывающую наклонную черту строго, когда Вы на самом деле укажете на каталог. Мысль я предполагаю Вас, могла просто добавить наклонную черту в конец каждый раз, если бы Вам действительно не нравилась она.
Если у вас есть оболочка над RouteLink, то есть простое решение проблемы. Например, у меня был метод-оболочка RouteLinkEx:
public static string RouteLinkEx(this HtmlHelper helper,string text,string routeName,RouteValueDictionary rvd,object htmlAttributes)
{
UrlHelper uh = new UrlHelper(helper.ViewContext.RequestContext,helper.RouteCollection);
// Add trailing slash to the url of the link
string url = uh.RouteUrl(routeName,rvd) + "/";
TagBuilder builder = new TagBuilder("a")
{
InnerHtml = !string.IsNullOrEmpty(text) ? HttpUtility.HtmlEncode(text) : string.Empty
};
builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
builder.MergeAttribute("href",url);
return builder.ToString(TagRenderMode.Normal);
//---
}
Как вы видите, я сначала использовал параметры для генерации URL. Затем я добавил "/" в конце URL-адреса. а затем я создал полную ссылку, используя этот URL.
Здесь перегрузка для RouteLinkEx(HtmlHelper, string,string, object)
public static string RouteLinkEx(this HtmlHelper helper, string text, string routeName, object routeValues)
{
UrlHelper uh = new UrlHelper(helper.ViewContext.RequestContext);
// Add trailing slash to the url of the link
string url = uh.RouteUrl(routeName, routeValues) + "/";
TagBuilder builder = new TagBuilder("a")
{
InnerHtml = !string.IsNullOrEmpty(text) ? HttpUtility.HtmlEncode(text) : string.Empty
};
//builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
builder.MergeAttribute("href", url);
return builder.ToString(TagRenderMode.Normal);
//---
}
Я случайно наткнулся на эту запись в блоге:
http://www.ytechie.com/2008/10/aspnet-mvc-what-about-seo.html
сегодня утром, прежде чем столкнулся с этим вопросом на StackOverflow. В этой записи (от автора вопроса) есть трекбек на эту запись в блоге Скотта Хансельмана с ответом на этот вопрос:
http://www.hanselman.com/blog/ASPNETMVCAndTheNewIIS7RewriteModule.aspx
Я был удивлен, что ссылки отсюда туда еще нет, поэтому просто добавил ее. :)
В ответе Скотта предлагается использовать URL Rewriting.
Вот моя версия для ASP.NET MVC 2
public static MvcHtmlString RouteLinkEx(this HtmlHelper helper, string text, RouteValueDictionary routeValues)
{
return RouteLinkEx(helper, text, null, routeValues, null);
}
public static MvcHtmlString RouteLinkEx(this HtmlHelper htmlHelper, string text, string routeName, RouteValueDictionary routeValues, object htmlAttributes)
{
string url = UrlHelper.GenerateUrl(routeName, null, null, null, null, null, routeValues, htmlHelper.RouteCollection, htmlHelper.ViewContext.RequestContext, false);
var builder = new TagBuilder("a")
{
InnerHtml = !string.IsNullOrEmpty(text) ? HttpUtility.HtmlEncode(text) : string.Empty
};
builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));
// Add trailing slash to the url of the link
builder.MergeAttribute("href", url + "/");
return MvcHtmlString.Create(builder.ToString(TagRenderMode.Normal));
}