Стандартный подход заключается в использовании groupby(keys)[column].idxmax()
. Однако для выбора нужных строк с помощью idxmax
вам нужно idxmax
вернуть уникальные значения индекса. Один из способов получить уникальный индекс - вызвать reset_index
.
После получения значений индекса из groupby(keys)[column].idxmax()
вы можете выбрать всю строку, используя df.loc
:
In [20]: df.loc[df.reset_index().groupby(['F_Type'])['to_date'].idxmax()]
Out[20]:
start end
F_Type to_date
A 20150908143000 345 316
B 20150908143000 10743 8803
C 20150908143000 19522 16659
D 20150908143000 433 65
E 20150908143000 7290 7375
F 20150908143000 0 0
G 20150908143000 1796 340
Примечание: idxmax
возвращает метки индекса , не обязательно ординалы. После использования reset_index
метки индексов также являются ординалами, но поскольку idxmax
возвращает метки (а не ординалы), лучше всегда использовать idxmax
в сочетании с df.loc
, а не df.iloc
(как я изначально сделал в этом посте.)
Используя .
может, действительно, отослать к току (или "контекст") узел, но не способ, которым Вы используете его здесь. В XPath, .[foo]
не допустимый синтаксис —, необходимо использовать self::node()[foo]
вместо этого. Кроме того, =
для оператора нужно что-то для соответствия против, в этом случае text()
селектор для доступа к текстовому содержанию элемента:
<xsl:for-each select="/books/book">
<xsl:if test="self::node()[text()='1112']">
Success
</xsl:if>
</xsl:for-each>
, Как указано в других ответах, однако, если Ваш for-each
не выполняет другие операции также, Вы не должны выполнять итерации вообще и можете использовать всего if
для выполнения той же задачи:
<xsl:if test="/books/book[. = 1112]">
Success
</xsl:if>
я пытаюсь установить условие, которое тестирует значение текущего узла в для - каждый, но я делаю что-то не так:
первой вещью, которая является неправильной, является синтаксис :
.[='1112']
существует две вещи неправильно здесь :
В [и] нет никакого предиката : "=" для оператора нужны два аргумента, но только один обеспечивается.
.[x = y]
все еще недопустимый синтаксис, хотя предикат является OK. Это должно быть указано как:
сам:: узел () [условие]
вторая вещь в предоставленном коде , который может быть улучшен , <xsl:for-each>
инструкция, которая не необходима вообще; единственное выражение XPath будет достаточно.
Для суммирования одно возможное выражение XPath, которое оценивает к необходимому булеву значению:
/books/book[. = '1112']
, Если действительно необходимо, чтобы условие быть протестированным в <xsl:for-each>
инструкция, затем одно правильное выражение XPath я использовал бы:
. = '1112'
вышеупомянутым является сравнение строк, и может не оценить к true()
, если существуют пробелы вокруг. Поэтому числовое сравнение может быть лучше :
. = 1112
В то время как Ben ответил на Ваш вопрос правильно, с помощью для - каждый - совершенно определенно неправильный общий подход. В конце концов, это - XSLT. Таким образом, Вы, вероятно, больше ищете что-то вроде этого:
<xsl:if test="/books/book[text()='1112']">
Success
</xsl:if>
XSLT имеет функцию, специально предназначенную для этой проблемы.