Вы можете использовать метод уменьшения:
long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, (x, y) -> x + y);
или
long sum = result.stream().map(e -> e.getCreditAmount()).reduce(0L, Integer::sum);
Вы должны сгруппировать оба объекта, которые хотите сохранить, а затем сосчитать тот, в котором вы хотите найти вхождения. Вот пример входного файла:
Brand Model
Acura RDX
Acura RDX
Acura RDX
Acura RDX
Acura RDX
Acura RDX
Acura RDX
Acura RDX
Acura RDX
Acura RDX
Beach Baby
Beach Baby
Beach Baby
Beach Baby
Beach Baby
Beach Baby
Beach Baby
Beach Baby
Beach Baby
Beach Baby
BMW 320i
BMW 320i
BMW 320i
BMW 320i
BMW 320i
BMW 320i
BMW 320i
BMW 550i
BMW 550i
BMW 550i
BMW 550i
BMW 550i
BMW 550i
BMW 550i
Cadillac Escalade
Cadillac Escalade
Cadillac Escalade
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Chana Cargo
Простые панды один вкладыш:
df = pd.read_table('fun.txt', header=0)
print(df.groupby(['Brand','Model'])['Model'].agg(['count']))
И вывод:
count
Brand Model
Acura RDX 10
BMW 320i 7
550i 7
Beach Baby 10
Cadillac Escalade 3
Chana Cargo 12
Если вы хотите отсортировать значения по частоте (от наибольшего к наименьшему) и оставьте только самое большое, измените однострочник на:
groupby_df = (df.groupby(['Brand','Model'])['Model'].agg(['count']).sort_values(by='count', ascending=False).reset_index().drop_duplicates('Brand', keep='first'))
, чтобы получить:
Brand Model count
0 Chana Cargo 12
1 Acura RDX 10
2 Beach Baby 10
3 BMW 320i 7
5 Cadillac Escalade 3
Вот один подход.
Установите объект DataFrameGroupBy:
df.groupby(["Brand", "Model"])
Используйте функцию GroupBy size
для вычисления размеров каждой подгруппы (возвращает как серия):
df.groupby(["Brand", "Model"]).size()
Преобразовать обратно в DataFrame, указав в столбце значения, вычисленные с помощью size
:
[ 114]
Сортировать фрейм данных в порядке убывания по Count
элементов подгруппы:
df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False)
Удалите повторяющиеся значения Brand
, сохраняя первую запись в кадре данных:
df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False).drop_duplicates("Brand", keep="first")
Одним из решений является сортировка, а затем удаление дубликатов после операции groupby
:
df = pd.DataFrame({'Brand': ['B1'] * 5 + ['B2'] * 5,
'Model': ['M1', 'M2', 'M1', 'M2', 'M3',
'N1', 'N1', 'N2', 'N3', 'N1']})
df['Count'] = df.groupby(['Brand', 'Model'])['Model'].transform('count')
res = df.sort_values('Count', ascending=False)\
.drop_duplicates('Brand')
print(res)
# Brand Model Count
# 5 B2 N1 3
# 0 B1 M1 2
Обратите внимание, что при этом удаляются дубликаты групповых верхних отсчетов.