Целое выражение, ожидаемое при попытке пузырьков в алфавитном порядке [дублировать]

Простое решение: применить функцию idxmax (), чтобы получить индексы строк с максимальными значениями. Это отфильтровывало бы все строки с максимальным значением в группе.

In [365]: import pandas as pd

In [366]: df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})

In [367]: df                                                                                                       
Out[367]: 
   count  mt   sp  val
0      3  S1  MM1    a
1      2  S1  MM1    n
2      5  S3  MM1   cb
3      8  S3  MM2   mk
4     10  S4  MM2   bg
5      1  S4  MM2  dgb
6      2  S2  MM4   rd
7      2  S2  MM4   cb
8      7  S2  MM4  uyi


### Apply idxmax() and use .loc() on dataframe to filter the rows with max values:
In [368]: df.loc[df.groupby(["sp", "mt"])["count"].idxmax()]                                                       
Out[368]: 
   count  mt   sp  val
0      3  S1  MM1    a
2      5  S3  MM1   cb
3      8  S3  MM2   mk
4     10  S4  MM2   bg
8      7  S2  MM4  uyi

### Just to show what values are returned by .idxmax() above:
In [369]: df.groupby(["sp", "mt"])["count"].idxmax().values                                                        
Out[369]: array([0, 2, 3, 4, 8])
18
задан helpermethod 16 August 2012 в 15:28
поделиться

3 ответа

Из help test:

  STRING1 > STRING2
                 True if STRING1 sorts after STRING2 lexicographically.

Внутри bash использует strcoll() или strcmp() для этого:

else if ((op[0] == '>' || op[0] == '<') && op[1] == '\0')
  {
    if (shell_compatibility_level > 40 && flags & TEST_LOCALE)
      return ((op[0] == '>') ? (strcoll (arg1, arg2) > 0) : (strcoll (arg1, arg2) < 0));
    else
      return ((op[0] == '>') ? (strcmp (arg1, arg2) > 0) : (strcmp (arg1, arg2) < 0));
  }

Последний фактически сравнивает коды ASCII, первый (используется, когда локаль включена) выполняет более конкретное сравнение, которое подходит для сортировки в заданной локали.

10
ответ дан Michał Górny 21 August 2018 в 09:23
поделиться

Это алфавитное сравнение (AIUI на порядок сортировки может влиять текущий язык). Он сравнивает первый символ каждой строки, и если один слева имеет более высокое значение, это правда, если нижний - false; если они совпадают, тогда он сравнивает второй символ и т. д.

Это not совпадает с целым сравнением, для которого вы используете [[ 2 -gt 1 ]] или (( 2 > 1 )) , Чтобы проиллюстрировать разницу между сопоставлением строк и целых чисел, учтите, что все следующие значения: «true»:

[[ 2 > 10 ]]     # because "2" comes before "1" in ASCII sort order
[[ 10 -gt 2 ]]   # because 10 is a larger number than 2
(( 10 > 2 ))     # ditto
6
ответ дан Gordon Davisson 21 August 2018 в 09:23
поделиться

Да, он сравнивает значение ascii и, если он равен, повторите сравнение в следующем символе.

/* Copyright (C) 1991, 1996, 1997, 2003 Free Software Foundation, Inc. 
   This file is part of the GNU C Library. 

   The GNU C Library is free software; you can redistribute it and/or 
   modify it under the terms of the GNU Lesser General Public 
   License as published by the Free Software Foundation; either 
   version 2.1 of the License, or (at your option) any later version. 

   The GNU C Library is distributed in the hope that it will be useful, 
   but WITHOUT ANY WARRANTY; without even the implied warranty of 
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
   Lesser General Public License for more details. 

   You should have received a copy of the GNU Lesser General Public 
   License along with the GNU C Library; if not, write to the Free 
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 
   02111-1307 USA.  */ 

#include <string.h> 
#include <memcopy.h> 

#undef strcmp 

/* Compare S1 and S2, returning less than, equal to or 
   greater than zero if S1 is lexicographically less than, 
   equal to or greater than S2.  */ 
int 
strcmp (p1, p2) 
     const char *p1; 
     const char *p2; 
{ 
  register const unsigned char *s1 = (const unsigned char *) p1; 
  register const unsigned char *s2 = (const unsigned char *) p2; 
  unsigned reg_char c1, c2; 

  do 
    { 
      c1 = (unsigned char) *s1++; 
      c2 = (unsigned char) *s2++; 
      if (c1 == '\0') 
        return c1 - c2; 
    } 
  while (c1 == c2); 

  return c1 - c2; 
} 
1
ответ дан olivecoder 21 August 2018 в 09:23
поделиться
  • 1
    Я не понимаю, почему вы вставляете какую-то, главным образом, неуместную функцию strcmp(). bash поддерживает локали, и в этом случае вместо этого используется strcoll(), чтобы выполнить сравнение, подходящее для конкретной кодировки. – Michał Górny 17 August 2012 в 09:12
  • 2
    Вы правы, но strcmp иллюстрирует сравнение строк в более простой форме. Целью является показать, как сравнивать строку в целом, а не конкретную реализацию bash. Метод тот же в bash, python, perl, PHP, c, Java ... – olivecoder 17 August 2012 в 11:05
  • 3
    Подробнее ... вопрос не о имени функции, а о методе. – olivecoder 17 August 2012 в 11:12
Другие вопросы по тегам:

Похожие вопросы: