Как я могу получить самый популярный предмет в группе в пандах?

Вы можете использовать метод уменьшения:

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);
2
задан Vinícius Silva 15 January 2019 в 18:13
поделиться

3 ответа

Вы должны сгруппировать оба объекта, которые хотите сохранить, а затем сосчитать тот, в котором вы хотите найти вхождения. Вот пример входного файла:

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
0
ответ дан d_kennetz 15 January 2019 в 18:13
поделиться

Вот один подход.

  1. Установите объект DataFrameGroupBy:

    df.groupby(["Brand", "Model"])

  2. Используйте функцию GroupBy size для вычисления размеров каждой подгруппы (возвращает как серия):

    df.groupby(["Brand", "Model"]).size()

  3. Преобразовать обратно в DataFrame, указав в столбце значения, вычисленные с помощью size:

    [ 114]

  4. Сортировать фрейм данных в порядке убывания по Count элементов подгруппы:

    df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False)

  5. Удалите повторяющиеся значения Brand, сохраняя первую запись в кадре данных:

    df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False).drop_duplicates("Brand", keep="first")

0
ответ дан John 15 January 2019 в 18:13
поделиться

Одним из решений является сортировка, а затем удаление дубликатов после операции 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

Обратите внимание, что при этом удаляются дубликаты групповых верхних отсчетов.

0
ответ дан jpp 15 January 2019 в 18:13
поделиться
Другие вопросы по тегам:

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