from functools import reduce #python 3
>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(lambda x,y: x+y,l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Метод extend()
в вашем примере изменяет x
вместо того, чтобы возвращать полезное значение (которое ожидает reduce()
).
Более быстрый способ сделать версию reduce
be
>>> import operator
>>> l = [[1,2,3],[4,5,6], [7], [8,9]]
>>> reduce(operator.concat, l)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Это занимает последнее. Не максимальное:
In [10]: df.drop_duplicates(subset='A', keep="last")
Out[10]:
A B
1 1 20
3 2 40
4 3 10
Вы также можете сделать что-то вроде:
In [12]: df.groupby('A', group_keys=False).apply(lambda x: x.loc[x.B.idxmax()])
Out[12]:
A B
A
1 1 20
2 2 40
3 3 10
Я не собираюсь дать вам весь ответ (я не думаю, что вы все равно ищете синтаксический анализ и запись в файл), но ключевой намек должен быть достаточным: используйте функцию set()
python, а затем sorted()
или .sort()
в сочетании с .reverse()
:
>>> a=sorted(set([10,60,30,10,50,20,60,50,60,10,30]))
>>> a
[10, 20, 30, 50, 60]
>>> a.reverse()
>>> a
[60, 50, 30, 20, 10]
Когда уже заданные сообщения отвечают на вопрос, я сделал небольшое изменение, добавив имя столбца, для которого применяется функция max () для лучшей читаемости кода.
df.groupby('A', as_index=False)['B'].max()
это также работает:
a=pd.DataFrame({'A':a.groupby('A')['B'].max().index,'B':a.groupby('A') ['B'].max().values})
Вы можете попробовать это также
df.drop_duplicates(subset='A', keep='last')
Я ссылался на это из https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop_duplicates. HTML
Главный ответ делает слишком много работы и выглядит очень медленным для больших наборов данных. apply
является медленным и его следует избегать, если это возможно. ix
устарел, и его также следует избегать.
df.sort_values('B', ascending=False).drop_duplicates('A').sort_index()
A B
1 1 20
3 2 40
4 3 10
Или просто группировать все остальные столбцы и брать максимум необходимого столбца. df.groupby('A', as_index=False).max()
Я думаю, что в вашем случае вам действительно не нужна группа. Я бы сортировал по убыванию вашего столбца B, а затем удалял дубликаты в столбце A, и если вы хотите, у вас также может быть новый красивый и чистый индекс:
df.sort_values('B', ascending=False).drop_duplicates('A').sort_index().reset_index(drop=True)