In [1]: df
Out[1]:
Sp Mt Value count
0 MM1 S1 a 3
1 MM1 S1 n 2
2 MM1 S3 cb 5
3 MM2 S3 mk 8
4 MM2 S4 bg 10
5 MM2 S4 dgd 1
6 MM4 S2 rd 2
7 MM4 S2 cb 2
8 MM4 S2 uyi 7
In [2]: df.groupby(['Mt'], sort=False)['count'].max()
Out[2]:
Mt
S1 3
S3 8
S4 10
S2 7
Name: count
Чтобы получить индексы исходного DF, вы можете сделать:
In [3]: idx = df.groupby(['Mt'])['count'].transform(max) == df['count']
In [4]: df[idx]
Out[4]:
Sp Mt Value count
0 MM1 S1 a 3
3 MM2 S3 mk 8
4 MM2 S4 bg 10
8 MM4 S2 uyi 7
Обратите внимание, что если у вас есть несколько максимальных значений для каждой группы, все будут возвращены.
Обновить
По градиентной вероятности, что это то, что запросит OP:
In [5]: df['count_max'] = df.groupby(['Mt'])['count'].transform(max)
In [6]: df
Out[6]:
Sp Mt Value count count_max
0 MM1 S1 a 3 3
1 MM1 S1 n 2 3
2 MM1 S3 cb 5 8
3 MM2 S3 mk 8 8
4 MM2 S4 bg 10 10
5 MM2 S4 dgd 1 10
6 MM4 S2 rd 2 7
7 MM4 S2 cb 2 7
8 MM4 S2 uyi 7 7
Вы могли бы найти bindParam
, когда вы просто хотите привязать ссылку на переменную к параметру в запросе, но, возможно, еще нужно сделать некоторые манипуляции на нем и только хотите, чтобы значение переменной вычислялось во время выполнения запроса , Он также позволяет выполнять более сложные вещи, такие как привязка параметра к вызову хранимой процедуры и добавление возвращаемого значения в связанную переменную.
Подробнее см. Документацию bindParam , документация bindValue и выполнить документацию .
Например,
$col1 = 'some_value';
$pdo->bindParam(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_other_value' for ':col1' parameter
bindValue
и передача массива в execute
ведут себя так же, как значение параметра фиксировано в этой точке, и SQL выполняется соответствующим образом.
Следуя тому же примеру выше, но используя bindValue
$col1 = 'some_value';
$pdo->bindValue(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_value' for ':col1' parameter
Когда передавая значения непосредственно в execute
, все значения рассматриваются как строки (даже если задано целочисленное значение). Поэтому, если вам нужно применять типы данных, вы всегда должны использовать bindValue
или bindParam
.
Я думаю, вы могли бы видеть, что bind*
используется больше, чем execute(array)
, поскольку многие считают, что это лучшее кодирование практика для явного определения типов данных в объявлениях параметров.
Передавая параметры вместе с методом $pdo->execute()
, все значения в массиве, которые должны быть переданы, как PDO::PARAM_STR
в оператор с функцией $pdo->bindParam()
.
Основное отличие, которое I теперь можно видеть, что с помощью функции $pdo->bindParam()
вы можете определить тип данных, переданный вместе с константами PDO::PARAM_*
, как описано в руководстве PHP.net
Простой, значение bindParam может измениться, но значение bindValue не может измениться. Пример:
$someVal=10;
$someVal2=20;
/* In bindParam, the value argument is not bound and
will be changed if we change its value before execute.
*/
$ref->bindParam(':someCol',$someVal);
$someVal=$someVal2;
$ref->execute();
//someCol=20
/* In bindValue, the value argument is bound and
never changed if we change its value before execute.
*/
$ref->bindValue(':someCol',$someVal);
// here assignment is referral (&$someVal)
$someVal=$someVal2;
$ref->execute();
//someCol=10
bindParam()
, поскольку иногда я получаю & quot; Не могу передать переменную по ссылке & quot; ошибки, и на самом деле не уверены, что это значит, почему я думаю об этом. – Martin Bean 12 September 2012 в 17:29bindParam
будет оценивать значение связанной переменной во время выполнения запроса. – Mike Brant 12 September 2012 в 17:34execute
большую часть времени, лично. – Explosion Pills 12 September 2012 в 18:05